Boost-Tupel Leistung
-
29-09-2019 - |
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?
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