0

IDE - Visual Studio 2008、Visual C++

  1. コピー コンストラクターを持つカスタム クラスClass1があります。
  2. ベクターもあるよ
  3. データは次のコードを使用して挿入されます
 Class1* objClass1;
 vector<Class1> vClass1;

 for(int i=0;i<1000;i++) {

    objClass1 = new Class1();
    vClass1.push_back(*objClass1);
    delete objClass1;

}

これで、挿入ごとにベクターが再割り当てされ、既存のすべてのコンテンツが新しい場所にコピーされます。たとえば、ベクトルに 5 つの要素があり、6 番目の要素を挿入すると、前の 5 つの要素と新しい要素が新しい場所にコピーされます (コピー コンストラクターにログ ステートメントを追加することでわかりました)。

しかし、 reserve()を使用すると、これは期待どおりには起こりません! 次の質問があります

  1. 常に予約ステートメントを使用することは必須ですか?
  2. vector はpush_backを実行するたびに再割り当てを行いますか? それとも私がデバッグしているために起こりますか?
4

2 に答える 2

2
  1. 必須ではありません。再割り当てはコストがかかるため、最適化です。
  2. 再割り当ての頻度は実装の詳細だと思います。ベクトルが再割り当てするたびにそのストレージを 2 倍にするのは正常だと思いますが、前述したように、これは実装によって異なります。(デバッグ ビルドを使用しているため、通常よりも頻繁に再割り当てが行われている可能性があります。)
于 2010-04-27T19:50:21.860 に答える
1

コピー コンストラクターのテストを非デバッグ コードに配置して調べ、プラットフォームで得られる結果をお知らせください。IMO ベクトルは、すべてのプッシュバックで再割り当てされるべきではありません。メモリを管理するよりスマートな方法がありますが、実装者がそれをしなかったことは間違いありません。

于 2010-04-27T20:22:14.183 に答える