私は以下の投稿を読みました。これは、移動のセマンティクスに関する非常に優れた洞察を提供します。
しかし、私はまだ移動セマンティクスに関する次のことを理解できていません-
コピーの省略とRVOは、移動コンストラクターがなくてもクラスで機能しますか?
クラスにmoveコンストラクターがない場合でも、STLコンテナーにはmoveコンストラクターがあります。のような操作のために
std::vector<MyClass> vt = CreateMyClassVector();
ソートなどの操作を実行するために。STLが内部で移動セマンティクスを活用して、移動コンストラクターを必要としないコピーの省略やRVOなどの操作を使用して内部でそのような操作を改善できないのはなぜですか。
3.以下の場合、移動セマンティクスの恩恵を受けますか?
std::vector< int > vt1(1000000, 5); // Create and initialize 1 million entries with value 5
std::vector< int > vt2(std::move(vt1)); // move vt1 to vt2
整数はプリミティブ型であるため、整数要素を移動しても利点はありません。または、ここで移動操作の後、vt2は単にヒープ内のvt1メモリを指し、vt1はnullに設定されます。実際に何が起こっているのですか?後者の場合、ポイント2でさえ、クラスのmoveコンストラクターは必要ない可能性があります。
4. std :: move on lvalueを使用してpush_back()が呼び出された場合。
std::vector<MyClass> vt;
for(int i=0; i<10; ++i)
{
vt.push_back(MyClass());
}
MyClass obj;
vt.push_back(std::move(obj));
ベクトルには連続したメモリ割り当てがあり、objはメモリ内の別の場所で定義されているため、セマンティクスを移動してobjメモリをベクトルvtの連続したメモリ領域に移動します。この場合、メモリを移動するのはメモリをコピーするのと同じくらい優れていません。ヒープの異なる領域にあるメモリを指すポインタを移動するだけで、連続するメモリ要件をベクトル化します。
よろしくお願いします!
[元々は移動セマンティクスの説明として投稿されましたが、コンテキストが変更されたため、新しい質問として古い質問をできるだけ早く削除するため、少し投稿します。]