`push_back` がベクター内でコピー コンストラクターを複数回呼び出すのはなぜですか?

DDD
リリース: 2024-11-03 15:39:30
オリジナル
962 人が閲覧しました

Why Does `push_back` Invoke the Copy Constructor Multiple Times in a Vector?

ベクトル プッシュバックでのコピー コンストラクターの複数の呼び出し

指定されたスニペットでは、ベクトル オブジェクト 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!