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數據頻繁移動很是耗時

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM