C++學習筆記(十五):vector對象在內存空間中是如何增長的

vector對象在內存空間中是如何增長的

 

我們都知道vector對象是動態存儲的,從這一點看有點像鏈表,可以動態的增加或減少元素。我們也知道鏈表中是有指針變量,專門用於存儲上一個和下一個元素的地址。正是因爲這兩個指針的存在,我們才能做到動態的存儲數據,即不用像數組那樣必須事先申請好空間。鏈表的缺點就是不能夠快速的隨機訪問其中元素,必須通過指針層層查找。

但是,vector既可以實現動態存儲數據,而且支持快速隨機訪問(用下標或者指針訪問元素)。對於能夠用下標查找的數據類型,其存儲方式必定是連續的,即每個元素緊挨着前一個元素存儲。

這樣對於vector來說,就會出現一個問題,我在初始定義vector的時候該給其申請多少內存空間?如果申請的很小,那麼我來了新的數據改存放在哪裏?如果申請的很大,我用不完,那豈不是很浪費內存空間?

當然對於vector這種標準庫類型,通常我們只關心如何使用它,而不關心其實如何實現的。不過對於其在存儲空間的實現方式還是瞭解一下比較好。


我們知道容器中元素連續存儲,且容器大小是可變的,考慮向vector中添加元素會發生什麼?如果沒有空間容納新的元素,容器不可能簡單的將其添加到內存的其他位置,因爲vector的元素必須連續存儲。因此容器必須分配新的空間來保存已用的元素和新的元素。將已有元素從舊位置移動到新空間,然後添加新元素,釋放舊空間。如果說我們每添加一個新的元素就執行一次這樣的操作,顯然性能會慢到我們不可接受。


爲了避免上面的代價,標準庫採用了可以減少容器空間重新分配的策略。當不得不獲取新的內存空間時,vector的實現通常會分配比新的空間需求更大的內存空間。容器預留這些空間作爲備用,從而用來保存更多新的元素。這樣,就不需要每次添加新的元素都重新分配容器的內存空間了。

 

vector類型提供了一些成員函數,允許我們與它的現實中內存分配部分互動。

c.capacity()     不重新分配內存空間的話,c可以保存多少元素

c.reserve(n)     分配至少能容納n個元素的內存空間

c.shrink_to_fit()  將capacity()減少爲size()相同大小。size()爲vector已經保存元素個數。

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