C++ STL中vector的內存機制和性能分析

vecotr是動態數組,顧名思義他可以動態的增加自己的長度。

內存機制:

但是怎樣的增加自己的長度?

vector有兩個函數一個是capacity()返回內存空間即緩衝區的大小,另一個是size()返回當前數組中數的數量。vector增加元素來說,當容量已經不能放進數據了,那麼他會重新申請一塊內存,把之前的內存利用複製構造函數複製到新的內存當中,然後把新添加的內容放入後面,另外此時的他申請的內存空間是原來空間的2倍,我測得是2倍

緩衝區的釋放
vecotor佔用的內存只增不減,erase只是將一段區間( earse(arr.begin(), arr.end() )的值清除掉或者將某個值( erase(x) )清除掉,但是對於內存空間來說是沒變化的

所有內存空間是在vector析構時候才能被系統回收。empty()用來檢測容器是否爲空的,clear()可以清空所有元素。但是即使clear(),vector所佔用的內存空間依然如故,無法保證內存的回收。

方法一:
vecotr<Type>().swap(arr) // 回收arr內存
方法二:
模板:
Template < class T >
void ClearVector( vector< T >& vt ) 
{
    vector< T > vtTemp; 
    veTemp.swap( vt );
}
調用模板函數
void ClearVector<vector< T> & vt)
{  
    vector<int> temp;//臨時對象未初始化,其緩衝區大小爲0,沒有數據  
    arr.swap(temp);//與我們的對象交換數據,arr的緩衝區就沒了。  
}//臨時變量會被析構,temp調用vector析構函數釋放空間

性能分析:

主要比較三種插入方式:

1、直接push_back() 2、 reserve(n) 預定n個空間,當然後續push_back()會增加,其中的值不確定, 3 resize(n, x) 申請n個空間初始化爲x,

reserve只是保持一個最小的空間大小,而resize則是對緩衝區進行重新分配,裏面涉及到的判斷和內存處理比較多所以比reserve慢一些,對於數據數目可以確定的時候,先預設空間大小是很有必要的。直接push_back數據頻繁移動很是耗時

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