vector記憶體機制和效能分析

2021-06-13 10:19:34 字數 2344 閱讀 9208

關於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 銷毀時,那些指標指向的物件不會被銷毀,那些記憶體...