6


0

std :: vector insert()再割り当て
私はstd

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

  • 新しいバッファを割り当てます

  • 古いバッファのプレフィックスをコピーします(0-挿入のインデックス)

  • 新しいバッファに新しい要素を構築します

  • 古いバッファのサフィックスをコピーします(インデックス-終了)

  • 古いバッファ内のすべてのアイテムでデストラクタを呼び出します

  • 古いバッファの割り当てを解除します

プレフィックスとサフィックスのコピーは、memmoveを使用して、可能な限り実行されます。 データの純粋なバイナリコピーをmemmoveしませんか? 要素のコンストラクターを呼び出しませんか? 私が思っていたのは、メモリが新しいバッファで再構築されずに移動されただけの場合、関数はなぜ古いバッファの要素のデストラクタを呼び出すのですか?

1 Answer


5


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

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

ただし、 `stmm

vector`の場合など、` memmove`を使用しても問題ない場合があり、STL実装はこのケースに特化して自由に使用できます。 あなたはソースコードを読むテンプレート「ブランチ」を見逃したかもしれません。