質問

によると ブースト::タプルドキュメント, 、タプルの単一の要素にアクセスすると、メンバー変数にアクセスするのと同じパフォーマンスがあります。たとえば、次の宣言を考慮してください。

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

これらの2つのステートメントには、パフォーマンスが等しい(または無視できる)パフォーマンスを持つ必要があります。

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

私はブーストのソースを調べました::タプル、そして私がそれらを正しく理解したなら(私がやったかどうかわからない)、 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)の複雑さを持っています。 Boostの過去の経験から、私はそれを誤って手に入れたと思います。しかし、私の間違いは何ですか?どうやって get 本当に動作しますか?

役に立ちましたか?

解決

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

他のヒント

C ++では、DOT演算子はポインターの敬意ではなく、直接オフセット計算であることを忘れないでください。一般的な答えは、はいです、すべてのnのi1.i2.i3.inは、コンパイル時間で計算可能な一定の時間操作です。

非常に深く掘り下げることなく、このためのコンパイラの内部について少し知りたい場合は、LLVM getElementPtrをご覧ください http://llvm.org/docs/langref.html#i_getelementptr これは、ClangのようなC ++コンパイラが、structリファレンスをコンパイルするときにLLVMをターゲットにする方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top