rendimiento tupla impulso
-
29-09-2019 - |
Pregunta
De acuerdo con impulso :: tupla documentación , acceder un solo elemento de una tupla tiene el mismo rendimiento que el acceso a una variable miembro. Por ejemplo, dada la siguiente declaración:
tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;
Estas dos afirmaciones deben tener el mismo (o con una diferencia insignificante) rendimiento:
t1.get<2>();
t2.c;
Me miró a las fuentes de impulso :: tupla y, si las había entendido correctamente (no estoy seguro de que hice), la función get<N>
en realidad realiza esta acción:
C get<2>(tuple<A, B, C>& t)
{
return t.tail.tail.head;
//Generally: return t.tail. <<N times>> .head;
}
Esto es más similar a una consulta en una lista enlazada de un acceso directo y, en lo que a undestand, tiene O (N) la complejidad en lugar de O (1), que se espera de un acceso de miembros. De mis experiencias pasadas con impulso, Me asumir erróneamente que lo tengo; pero lo que es mi error? ¿Cómo funciona realmente get
trabajo?
Solución
son correctas sobre la lista como el rendimiento. Sin embargo, puede ser resuelto en tiempo de compilación y por lo tanto se reduce a O (1) en tiempo de ejecución. (Dada una suficientemente buena compilador de optimización.)
Otros consejos
Recuerde que en C ++, el operador punto no es una deferencia puntero, que es un cálculo de compensación directa. La respuesta general es que sí, i1.i2.i3.in para todo n es una constante calculable operación de tiempo en tiempo de compilación.
Si quieres aprender un poco sobre el funcionamiento interno del compilador de este sin cavar muy profundo, vistazo a LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr Esto es exactamente cómo un compilador de C ++ como CLANG apuntaría LLVM al compilar una referencia struct.