STL vector記憶體分配

2021-07-29 09:55:41 字數 2094 閱讀 9444

標籤: c++

stlvector

記憶體

2013-12-15 19:57

3708人閱讀收藏

舉報

stl(10)

作者同類文章x

在stl的容器中,vector可以說是最容易理解和使用的容器了,以前使用陣列的時候,如果不確定有多少資料要儲存,就會預先分配乙個大的陣列,如果實際沒有用到那麼多,又會浪費很多的記憶體資源,如果不分配大的陣列又擔心不夠用,有了vector之後,這些問題再也不用擔心了,vector會動態的增長空間,當vector空間不足時會自動申請一片更大的記憶體空間,以儲存新的資料。

vector動態記憶體增長的過程如下:

1) 申請一塊更大的記憶體空間以儲存新資料。

2) 將資料從舊記憶體空間拷貝到新記憶體空間。

3) 析構舊記憶體空間中的物件。

4) 釋放舊記憶體空間。

對於程式設計師來說,這簡直就是乙個神器,但是在享受vector帶來方便的同時,它也隱藏了一些記憶體方面的問題,需要我們注意一下。

1、預先分配兩倍的記憶體空間

對於乙個陣列,只要通過元素的個數以及元素的型別就可以得到占用的記憶體空間,而對於vector情況就不一樣,為了提高效率,vector會預先分配一定的記憶體空間,減少申請記憶體以及資料移動的開銷,因此vector實際占用的記憶體空間要比需要的多一些。

如果對記憶體要求比較高的程式,使用vector一定要小心了,當vector空間不足時,會申請一塊約是當前占用記憶體兩倍的新空間以儲存更多的資料,若可用記憶體為1g,而當前vector已占用的記憶體空間0.5g,當再插入乙個元素,vector將會申請一塊約1g的記憶體空間,瞬間記憶體就被用光了,導致程式崩潰。

2、迭代器失效

當vector空間不足時,會申請一塊更大的記憶體空間,並將原指向記憶體空間的資料移動到新的記憶體空間中,接著,舊的記憶體空間將會被**。這裡就可能會出現問題了,當vector指向新的記憶體空間之後,原來指向舊記憶體空間的迭代器都會失效了,若再使用這些失效迭代器,將會出現coredump。因為當需要插入資料到vector的時候,就需要注意當前的迭代器還是否有效了。

3、釋放vector所佔記憶體

vector已經申請的記憶體空間並不會縮減,即使呼叫clear()函式,也只是清空vector的所有元素,真正占用的記憶體空間也不會減少。有一種方法可以釋放vector占用的記憶體空間,swap()函式可以交換兩個vector物件所指向的記憶體空間,

下面例子說明了swap()函式的使用方法,假設擁有乙個vector物件vec:

[cpp]view plain

copy

print

?vector tmp;  //tmp為空

vec.swap(tmp);      //vec和tmp交換指向的記憶體空間

vectortmp;	//tmp為空

vec.swap(tmp); //vec和tmp交換指向的記憶體空間

如果**想要更加精簡,則可以選擇下面的寫法:

[cpp]view plain

copy

print

?vec.swap(vector());//vec與臨時物件交換了指向的記憶體空間

vec.swap(vector());//vec與臨時物件交換了指向的記憶體空間
上面兩種方式都使用乙個沒有資料的vector物件與當前vetor物件進行了交換,對於vec來講,其記憶體空間縮減為0,同理,若想vec變為指定大小,則只需要與乙個大小一樣的vector物件進行swap即可。

4、預先申請記憶體空間

若一開始就大概確定需要的記憶體空間,則可以使用vector的reserve()函式預先申請足夠的記憶體空間,這樣做,既可以減少記憶體增長時的申請記憶體和資料移動的開銷,避免了迭代器失效的問題,也防止了申請了超出預期的的記憶體空間,導致記憶體耗盡的問題;若一開始不確定需要的記憶體空間,則可以先預留足夠大的空間,當所有資料都插入後,通過swap()函式去除多餘的容量即可。

頂 60

踩 0

我的同類文章

stl(10)

stl vector記憶體分配

1 呼叫push back時,其內部的記憶體分配是如何進行的?2 呼叫clear時,內部是如何具體實現的?若想將其記憶體釋放,該如何操作?vector的工作原理是系統預先分配一塊capacity大小的空間,當插入的資料超過這個空間的時候,這塊空間會讓某種方式擴充套件,但是你刪除資料的時候,它卻不會縮...

stl vector 記憶體管理

size是指容器當前擁有元素的個數,而capacity是指容器在必須分配新的儲存空間之前可以存放的元素總數。如vectorivect 10 ivect.capacity 10,ivect.size 0,當你向ivect中插入元素時,只要沒有超過十個,那麼capacity就不變,而size為你插入的元...

STL Vector記憶體機制

vector可以看作是乙個動態陣列,其記憶體是連續的,並具有以下特性 1 vector中的size表示當前實際資料數量,capacity 則表示當前可容納的數量,即已開闢的記憶體。2 釋放 pop back 刪除 erase 和 清空 clear 只會改變size,不會改變capacity 只有在v...