Frage

Nach boost :: tuple Dokumentation , Zugriff ein einzelnes Element eines Tupels hat die gleiche Leistung wie eine Member-Variable zugreift. Zum Beispiel die folgende Erklärung gegeben:

tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;

Diese beiden Aussagen sind gleich (oder mit vernachlässigbarer Unterschied) Leistung:

t1.get<2>();
t2.c;

Ich sah in die Quellen von boost :: tuple und, wenn ich sie richtig verstanden (ich bin nicht sicher, dass ich), get<N> Funktion führt tatsächlich diese Aktion:

C get<2>(tuple<A, B, C>& t)
{
    return t.tail.tail.head;
    //Generally:  return t.tail. <<N times>> .head;
}

Das ist ähnlich wie bei einem Look-up in einer verknüpften Liste als ein direkter Zugang, und, soweit ich undestand, hat O (N) Komplexität anstelle von O (1), die von einem Mitglied Zugang zu erwarten ist. Aus meinen bisherigen Erfahrungen mit Boost, würde ich nehme an, ich habe es zu Unrecht; aber was ist mein Fehler? Wie funktioniert get wirklich?

War es hilfreich?

Lösung

Sie sind richtig über die Liste-ähnliche Leistung. Allerdings kann es bei der Kompilierung-Zeit aufgelöst werden und somit läuft darauf hinaus, O (1) während der Laufzeit nach unten. (Eine ausreichend gute optimierenden Compiler gegeben.)

Andere Tipps

Denken Sie daran, in C ++, der Punkt-Operator keinen Zeiger Achtung, es ist eine direkte Berechnung versetzt ist. Die allgemeine Antwort ist ja, i1.i2.i3.in für alle n eine Konstante Zeitbetrieb kalkulierbar bei der Kompilierung.

Wenn Sie ein wenig über die Compiler-Interna für diese ohne sehr tief zu graben, Blick auf LLVM getelementptr

scroll top