タプルパフォーマンスをブーストします
-
29-09-2019 - |
質問
によると ブースト::タプルドキュメント, 、タプルの単一の要素にアクセスすると、メンバー変数にアクセスするのと同じパフォーマンスがあります。たとえば、次の宣言を考慮してください。
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をターゲットにする方法です。