文字列とベクトルの両方でメモリを連続させておくために、大量の再割り当てがありますか?
ベクトルの要素は連続していますが、含まれている各文字列内に、テキストコンテンツが格納されている動的に割り当てられたストレージへのポインタがあります(文字列が空ではなく、固定サイズの内部バッファに収まるほど短いと仮定します-既知の手法実装が使用する必要があるかもしれないが必須ではない「短い文字列の最適化」として)。
char
ここで、ベクトルと文字列の両方について、現在のサイズ(要素数/データ用)と容量(既に予約されており、コンテナーが割り当てなくても成長できるヒープの量)の違いを理解することが重要です。ヒープの新しい領域と要素を移動します。
したがって、既存の容量が十分である場合、文字列の連結が適切に行われます。容量を増やす必要がある場合は、動的メモリへのその1つの文字列のポインタが更新され、テキストコンテンツがコピーされる、新しく割り当てられたより大きなヒープ領域がアドレス指定され、元のヒープ領域が解放されます。
操作によってベクトルが再割り当てされるpush_back()
可能性がありますが、文字列オブジェクトはヒープメモリの個別のブロックを「所有」します。
特定の実装が何をしているのか知りたい場合は、コンテナの操作の前後と、最初の要素のアドレスを印刷できます。size()
それでもcapacity()
、容量がサイズを超える量は、再割り当ては標準で指定されていないため、コンパイラのフラグ/バージョン、OSなどで変更される可能性もあります。
概略的には、次のようなものです。
VECTOR: /-------->[first string's text]...extra capacity...
[ first string object /]
[ second string object \]
...extra vector capacity... \-->[second string's text]...extra capacity...