ホームページ  >  記事  >  バックエンド開発  >  C ベクトルでの「push_back」操作中にコピー コンストラクターが何回呼び出されますか?

C ベクトルでの「push_back」操作中にコピー コンストラクターが何回呼び出されますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 07:45:30749ブラウズ

How Many Times Does the Copy Constructor Get Called During `push_back` Operations in a C   Vector?

Vector の Push_back コピー動作を理解する

Vector を操作する際、開発者は、push_back 操作中のコピー コンストラクターの呼び出し頻度に関するクエリに遭遇することがよくあります。例を使ってこの動作を詳しく見てみましょう。

次の C コードを考えてみましょう。

<code class="cpp">class Myint {
  int my_int;
public:
  Myint() : my_int(0) {
    cout << "Inside default" << endl;
  }
  Myint(const Myint& x) : my_int(x.my_int) {
    cout << "Inside copy with my_int = " << x.my_int << endl;
  }
};

int main() {
  vector<Myint> myints;
  Myint x;
  myints.push_back(x);
  x.set(1);
  myints.push_back(x);
}</code>

このスニペットは、push_back 操作中にコピー コンストラクターを 2 回トリガーすると予想されます。ただし、実行すると、次の出力が観察されます:

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1

コピー コンストラクターが 3 回呼び出されているように見えるのはなぜですか?

  • Push_back挿入:最初の Push_back 操作は x をベクターに挿入し、コピー コンストラクターを呼び出して新しく作成された要素を初期化します。
  • Vector reallocation: 2 番目の要素が Push_back されると、ベクターはその容量に達します。メモリを制限して再割り当てします。 Myint には暗黙的に定義された移動コンストラクターがないため、コピー コンストラクターが再び使用されます。今回は、最初の要素 (my_int が 0 のまま) と、次に x (my_int が 1 に更新された) の両方を複製します。

したがって、コピー コンストラクターは合計 3 回呼び出されます。この動作を最適化するには:

  • 事前にメモリを予約します: より高いベクトル容量を指定することで、再割り当ての可能性を減らし、コピーを最小限に抑えることができます。
  • push_back の代わりに emplacement を使用します: myints.emplace_back(0) は、余分なコピーを避けて、ベクター内に新しい要素を直接構築します。

以上がC ベクトルでの「push_back」操作中にコピー コンストラクターが何回呼び出されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。