更多 C++ 習慣用法/縮減至適合
外觀
將容器的容量最小化,足以容納現有範圍。
"交換至適合",由 Scott Meyers 在他的著作 "Effective STL" 中介紹。
標準庫容器通常分配的記憶體量大於其實際元素數量。這種策略導致了一種最佳化,即在容器大小增加時節省了一些分配。另一方面,當容器大小減小時,容器中通常會有剩餘容量。容器的剩餘容量可能是對記憶體資源的不必要的浪費。縮減至適合習慣用法已被開發出來將額外的容量減少到所需的最小容量,從而節省記憶體資源。
縮減至適合習慣用法與下面給出的示例一樣簡單。
std::vector<int> v;
//v is swapped with its temporary copy, which is capacity optimal
std::vector<int>(v).swap(v);
語句的前半部分 std::vector<int>(v) 建立了一個臨時整型向量,它保證[1] 僅分配足夠的記憶體來容納引數 v 中的所有元素。語句的後半部分使用非丟擲交換成員函式將臨時向量與 v 交換。swap() 非常高效,僅僅相當於交換向量之間的指標。交換後,臨時物件將超出範圍並刪除 v 最初持有的記憶體,而 v 保留了臨時物件分配的記憶體,因此它剛好足以容納 v 中的原始元素。
- ↑ ISO/IEC 14882:1998 似乎沒有記錄這種複製建構函式的行為。這種行為是在哪裡保證的?
一個更可靠的解決方案(特別是對於 std::string,它可能使用引用計數來實現,但對於 std::vector 也是如此,其複製建構函式可能會複製另一個向量的額外容量[1])是使用“範圍建構函式”而不是複製建構函式。
std::vector<int> v;
//v is swapped with its temporary copy, which is capacity optimal
std::vector<int>(v.begin(), v.end()).swap(v);
- ↑ http://www.aristeia.com/BookErrata/estl1e-errata.html(搜尋“string(s.begin(), s.end()).swap(s)”)
在 C++11 中,一些容器將此習慣用法宣告為函式shrink_to_fit(),例如 vector、deque、basic_string。shrink_to_fit()是一個非約束請求,用於將capacity()減少到size().
- 程式語言 - C++ 草案標準。