初識vector內存增長機制

一、vector的特點

  • 動態性,空間大小既可以增大亦可以減少;
  • 連續性,vector元素序列在空間地址是連續分佈的;
  • 穩定性,vector元素序列在空間地址是相對固定的。

1.1 vector的動態性

vector常常被稱爲動態數組,這裏的“動”應該相對於內置數組中的“靜”,聲明一個內置數組意味着最大容量已經確定,反之,動態數組則可以根據用戶的需要進行調整。

1.2 vector的連續性

vector的元素序列存儲是一段連續的內存區間,內存區間的劃取由編譯器決定,vector所能容納的最大元素個數稱之爲容量(capacity),目前已經存放的元素個數爲(size),構造一個vector對象時capacity=size,在添加一個元素後,存在size>capacity,此時必須增加capacity++,同時編譯器必須重新分配內存並將原有數據拷貝至新的內存空間,最後寫入新的元素。可見按照一次增加一個capacity的方法需要三步:

  • 重新劃分內存
  • 複製原有元素個數
  • 寫入新的數據

如果程序再次增加一個元素,需要重新經過上述三個步驟,性能將會慢到不可接受[1]

1.3 vector的穩定性

爲了提高性能,空間換取時間是一個解決方法。即每一次分配一個比新的空間更大的內存空間,通常的策略是分配一個比capacity=2size,或capacity=1.5size[2]。此時vector將會有一定的capacity的穩定性,他的代價是佔用了大於size的capacity空間。當然在你也可以手動回收和設置分配策略,其方法是通過下面兩個方法:

  • shrink_to_fit() 嘗試回收尚未使用的capacity空間
  • reserve(n) 顯式告知編譯器需要的capacity空間大小

另,我們可以通過調用capacity(),查看capacity空間大小。

小結:

  • vector的三個特點:動態、連續和穩定性
  • vector通常會分配比實際size更大的capacity以減少內存操作,這是一種空間換取時間的思想
  • vector在C++11下可以通過shrink_to_fit來回收多餘空間,reserve控制capacity大小

[1] C++ primer 5th P317
[2] 取決於編譯器具體的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章