18

「パーフェクトフォワーディング」の仕組みを教えてください。

ベクトルのemplace_backは、引数が可変個引数テンプレートとして実装されているため、オブジェクトをコピーしたり移動したりする必要がないことを読みました。

std::vector<T>::emplace_back(_Args&&... __args)

もっと詳しく説明していただけますか?なぜコピーも移動もしないのですか?

4

2 に答える 2

15

emplace_backベクトル内の正しい位置に要素を直接構築します。のように考えてください。

vector<T> v;
v.emplace_back(a,b,c);

に変換されます (idx は新しいインデックスです)

new (v.data()+idx) T(a,b,c);

(実際には、引数を転送することを含むもう少し複雑ですがstd::forward<_Args>()...、 emplace 操作のキーを取得するのがより混乱する可能性があります)

于 2012-07-09T10:13:46.577 に答える
2

emplace_back では、実際には 2 つのことが起こっています。

  1. タイプ T のオブジェクトを渡すのではなく、引数を T のコンストラクターに渡します。このようにして、オブジェクトの構築が遅れます。新しいオブジェクトが必要とするメモリに対応するためにベクトルが拡張され、コンストラクターが呼び出されてオブジェクトが初期化されます。ベクトルで。Variadic テンプレートはコピーとは何の関係もありません。可変数の引数のみをコンストラクターに転送できます。
  2. コンストラクター自体への引数は、右辺値参照として渡され、std::move を使用してコンストラクターに転送されるため、コピーされません。基本的に、ムーブ セマンティクスはオブジェクトのディープ コピーを回避します。
于 2012-07-09T10:17:47.233 に答える