More C++ Idioms/縮めて合わせる(Shrink-to-fit)
出典: フリー教科書『ウィキブックス(Wikibooks)』
目次 |
[編集]
縮めて合わせる(Shrink-to-fit)
[編集] 意図
コンテナの容量(capacity)を、既存範囲を保持するのに丁度十分なサイズに最小化する。
[編集] 別名
[編集] 動機
STL のコンテナはしばしば、実際の要素数よりも多いメモリを確保する。 その結果、コンテナのサイズが拡大するときのメモリ確保を抑えることによる 最適化がもたらされる。 一方、コンテナのサイズが減少した時には、しばしば余分な容量が残る。 コンテナの余分な容量は、メモリリソースの不要な消費になりうる。 縮めて合わせる(Shrink-to-fit)イディオムは、余分な容量を最小限必要な容量に切り詰め、メモリリソースの消費を抑えるために開発された。
[編集] 解法とサンプルコード
縮めて合わせる(Shrink-to-fit)イディオムは、下記で示されているように単純である。
std::vector<int> v; //... たくさんの push_back と、たくさんの v に対する削除 //その結果、v のサイズは小さいが、容量は大きい。 std::vector<int>(v).swap (v);
文の前半では、std::vector<int> (v) により、整数の一時的な vector が作成される。 ここで、引数の vector v 中にある全ての要素を保持するために丁度十分なメモリが確保されることが保証される。 文の後半では、throw しない swap(non-throwing swap)イディオムを用いて、一時的な vector と v とが効率的に swap (交換)される。 swap の後で、コンパイラによって作成された一時オブジェクトはスコープを外れ、もともと v によって保持されていたメモリ領域が解放される。 もともとの vector v は一時オブジェクトによって確保されたメモリを持つようになる。 このメモリは、v 中にあったもともとの要素全てを保持するのに丁度十分である。