6

std::vector コードを調べていたところ、よくわからないものが見つかりました。capacity < size() + 1 の場合、新しい要素を挿入できるようにバッファーを再割り当てする必要があります。それが何をするか(コードから抽出できた限り)は次のとおりです。

  • 新しいバッファを割り当てます
  • 古いバッファのプレフィックスをコピーします (0 - 挿入のインデックス)
  • 新しいバッファに新しい要素を構築します
  • 古いバッファのサフィックスをコピーします (インデックス - 終了)
  • 古いバッファ内のすべての項目でデストラクタを呼び出す
  • 古いバッファの割り当てを解除

私が見る限り、接頭辞と接尾辞のコピーは memmove で行われます。memmove はデータの純粋なバイナリ コピーではありませんか? 要素のコンストラクターを呼び出しませんよね?私が疑問に思っていたのは、メモリが移動されただけで、新しいバッファで再構築されていない場合、関数が古いバッファの要素でデストラクタを呼び出すのはなぜですか?

4

1 に答える 1

5

MSVC8 のvector実装を見てみましたが、memmove(). 前のベクター要素は移動されず、コピーされ、それらのコピー c'tor が呼び出されて新しいバッファーにコピーされます (バッファーは単一の割り当てで割り当てられ、要素は配置 new を使用して構築されます)。

もちろん、これは MSVC の実装にすぎませんがvector、標準に従って a がどのように動作するかです。

ただし、使用memmoveが問題ない場合もあります (たとえば、a の場合std::vector<int>)。STL 実装は、この場合に自由に特化できます。ソース コードを読み取るテンプレートの「ブランチ」を見逃している可能性があります。

于 2010-01-24T14:21:29.667 に答える