6

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実際にはどのように機能しますか?

4

2 に答える 2

6

あなたはリストのようなパフォーマンスについて正しいです。ただし、コンパイル時に解決できるため、実行時にO(1)になります。(十分に優れた最適化コンパイラーが与えられます。)

于 2010-11-29T08:35:34.037 に答える
3

C++ では、ドット演算子はポインター参照ではなく、直接オフセット計算であることを思い出してください。一般的な答えはイエスです。すべての n に対する i1.i2.i3.in は、コンパイル時に計算可能な一定時間の操作です。

あまり深く掘り下げずに、コンパイラの内部構造について少し学びたい場合は、LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr参照してください。構造体参照のコンパイル。

于 2011-07-15T18:50:38.163 に答える