ベクトル プッシュバックでのコピー コンストラクターの複数の呼び出し
指定されたスニペットでは、ベクトル オブジェクト myints の Push_back メソッドがコピーを呼び出します。コンストラクターを 2 回以上実行しており、最初の期待に反しています。これにより、ベクトルの内部動作に関する疑問が生じます。
説明:
最初のプッシュバック:
- A新しい要素は x を使用してベクトルに挿入されます。これにより、引数を使用した新しい要素の初期化という 1 つのコピー操作がトリガーされます。 x のデフォルト コンストラクターは my_int をゼロに初期化するため、コピー コンストラクターはゼロを報告します。
2 番目のプッシュバックと再割り当て:
- 2 番目の要素は次のとおりです。プッシュバックされました。ただし、ベクターの容量を超えたため、再割り当てが必要になります。 Myint には暗黙的な移動コンストラクターがないため、代わりにコピー コンストラクターが使用されます。
- 最初の要素は、ゼロ値を保持したまま新しいメモリにコピーされます。続いて、コピー コンストラクターの出力に反映されているように、x がコピーされ、my_int が 1 に設定された 2 番目の要素が初期化されます。
- これにより、合計 3 回のコピー コンストラクター呼び出しが行われます。
呼び出しの数:
- コピー コンストラクターの呼び出しの数は、初期ベクトル容量により実装によって異なる場合があります。ただし、呼び出しは最低 2 回です。
- reserve(2) を使用してベクトルの容量を事前に増やすことで、再割り当てを回避でき、コピー操作を減らすことができます。
コピー操作:
- または、emplace_back メソッドを要素の挿入に使用できます。コピーや移動は必要なく、引数を要素のコンストラクターに直接転送します。
要約すると、push_back メソッドでは、内部ベクトルの再構築により複数のコピー コンストラクターの呼び出しが発生する可能性があります。これを回避するには、reserve() を使用して容量を増やすか、emplace_back を使用してコピーなしで効率的に要素を挿入できます。
以上が`push_back` がベクター内でコピー コンストラクターを複数回呼び出すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。