關於vector,簡單地講就是乙個動態陣列,裡面有乙個指標指向一片連續的記憶體空間,當空間不夠裝下資料時會自動申請另一片更大的空間,然後把原有資料拷貝過去,接著釋放原來的那片空間;當釋放或者說是刪除裡面的資料時,其儲存空間並不會釋放,僅僅只是清空了裡面的資料。接下來,我會詳細地說說這些。
一、首先,看看vector的記憶體分配機制:
vectorarr;
ofstream wf("1.txt");
for(int i=0;i<100;++i)
void _tidy()
_myfirst = 0, _mylast = 0, _myend = 0;//指標全部歸零
}
那麼,我們可以在需要的時候強制釋放緩衝區不?
二、如何強制釋放vector的緩衝區:
答案是可以的,既然析構時會釋放空間,那麼我們就可以換個方式呼叫析構函式。
// //方法一、
vector().swap(arr); //交換後
//方法二、
//臨時變數會被析構,temp呼叫vector析構函式釋放空間
三、如何使用提高效能:為了比較,我們用了三種方式來把100個資料存入vector中,分別是:1、直接每次push_back();2、使用resize()提前分配100個空間,然後push_back;3、使用reserve提前分配100個儲存空間。msdn中,這兩個個函式的說明分別是:
reservereserves a minimum length of storage for a vector object, allocating space if necessary.
resize
specifies a new size for a vector.
在這裡我們初始化的時候使用感覺好像是差不多。
reserve只是保持乙個最小的空間大小,而resize則是對緩衝區進行重新分配,裡面涉及到的判斷和記憶體處理比較多,當然了在這裡由於最初都是空的所以差別不大。
兩者的區別檢視:vector::reserve和vector::resize的區別。
由此可見,對於資料數目可以確定的時候,先預設空間大小是很有必要的。直接push_back資料頻繁移動很是耗時(當然了,資料小的可以忽略的)。
真個測試程式的完整**如下
#include "stdafx.h"
#include "btree.h"
#include #include #include #include #include using std::ofstream;
using std::cout;
using std::endl;
using std::vector;
int _tmain(int argc, _tchar* argv)
//臨時變數會被析構
cout<
for(int i=0;i<100;++i)
v1.push_back(i);
} cout<
v2.resize(100);
for(int i=0;i<100;++i)
v2[i] = i;
} cout<
v3.reserve(100);
for(int i=0;i<100;++i)
v3.push_back(i);
} cout<
ofstream wf("2.txt");
int nflag=v4.capacity();
for(int i=0;i<100;++i)
{ v4.push_back(i);
if(nflag!=v4.capacity())
{ nflag=v4.capacity();
cout<
C STL中vector的記憶體機制和效能分析
vecotr是動態陣列,顧名思義他可以動態的增加自己的長度。但是怎樣的增加自己的長度?vector有兩個函式乙個是capacity 返回記憶體空間即緩衝區的大小,另乙個是size 返回當前陣列中數的數量。vector增加元素來說,當容量已經不能放進資料了,那麼他會重新申請一塊記憶體,把之前的記憶體利...
list和vector效能分析
功能 在list 和vector 中插入1百萬個上述型別所花的時間以秒為單位 表 描述 正如你所看到的對於小的資料型別vector的效能要比list好得多,而對於大型的數 據型別則相反list的效能要好得多,區別是由於vector 需要重新增長以及拷貝元素。但是資料型別的長度不是影響容器效能的惟一標...
vector記憶體釋放機制
vector 中的內建有記憶體管理,當 vector 離開它的生存期的時候,它的析構函式會把 vector 中的元素銷毀,並釋放它們所占用的空間,所以用 vector 一般不用顯式釋放 不過,如果你 vector 中存放的是指標,那麼當 vector 銷毀時,那些指標指向的物件不會被銷毀,那些記憶體...