なぜなサイズの変更は、明確な作品GotW54?
質問
参考記事 Gotw54 によるHerbSutterなのだそうだつ
のとの付き合い方"について考える"シュリンクにフィット"は、 ベクトルは、deque
グ方法、上達するためのコツなどを完全に明確なベクトルまたは deque
まだ利用
container.resize()
やcontainer.clear()
上記の課題 または私を見落とさないよう?
解決
が異なるものであるとの考え方がベクター開催: size
Vs capacity
.ただけの場合 resize
ベクトルがいて保証するものではありませんの力にどのくらいメモリを予約)が変わらねばならない。 resize
操作に関係などを使用していまはどのくらいのベクトルの容量です。
その一例です。
size == how much you are using
capacity == how much memory is reserved
vector<int> v(10);
v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear() // size == 0 but capacity (may or may) not be changed
の能力は変わらない全ての操作でも多くのメモリ割り当て/割り当て解除オーバーヘッド。たいという場合に必要なもの"を修復させようとするとエラーが"の メモリーの予約 によるベクター。
他のヒント
いサイズの変更()もクリア()がベースとなっています。の .capacity()
のベクトルが保証されるものとして、現在の size()
のベクターに保障される少なくとも、とても reserve()
dます。また、これです。capacity()
な縮小も少なくともども、過去の size()
または reserve()
かる.
現在は、 .capacity()
のベクターはそのメモリでreserved.ないことが多いすべてのメモリcotainsオブジェクト。リサイズの除去物、なかなかできないのでリサイクルメモリの内容を消去します。ベクターでのみのリサイクルメモリバッファの割り当てが大きなバッファです。
スワップトリック作品をコピーすべてのojectsをされており、より小型で、より適切なメモリバッファです。その後、独自のメモリバッファリサイクル使用が可能です。これに違反する前にメモリバッファのベクターで成長します。しかし、スワップトリックは、一時的にしてい 2 ベクトル.
のベクターのサイズや容量です。であるXの要素が初期化されていないメモリのための店舗のY要素です。典型的な実施を消去リサイズ時にリサイズ小さいサイズ)は、明らかな影響を与え能力:ベクトルを常にメモリー周辺は、新規追加したい項目です。