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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top