boost :: tupleのドキュメントによると、タプルの1つの要素にアクセスすることは、メンバー変数にアクセスすることと同じパフォーマンスになります。たとえば、次の宣言があるとします。
tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;
これらの2つのステートメントは、同等の(または無視できる程度の)パフォーマンスを持つ必要があります。
t1.get<2>();
t2.c;
boost :: tupleのソースを調べましたが、正しく理解していれば(理解したかどうかはわかりませんが)、get<N>
関数は実際に次のアクションを実行します。
C get<2>(tuple<A, B, C>& t)
{
return t.tail.tail.head;
//Generally: return t.tail. <<N times>> .head;
}
これは、直接アクセスよりもリンクリストでのルックアップに似ており、私が理解している限り、メンバーアクセスから予想されるO(1)ではなくO(N)の複雑さを持っています。ブーストに関する私の過去の経験から、私はそれを間違って得たと思います。しかし、私の間違いは何ですか?get
実際にはどのように機能しますか?