C STL中vector的記憶體機制和效能分析

2021-10-07 20:58:53 字數 1026 閱讀 8903

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

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

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

緩衝區的釋放

vecotor占用的記憶體只增不減,erase只是將一段區間( earse(arr.begin(), arr.end() )的值清除掉或者將某個值( erase(x) )清除掉,但是對於記憶體空間來說是沒變化的

所有記憶體空間是在vector析構時候才能被系統**。empty()用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),vector所占用的記憶體空間依然如故,無法保證記憶體的**。

方法一:

vecotr()

.swap

(arr)

// **arr記憶體

方法二:

模板:template <

class

t>

void

clearvector

( vector< t >

& vt )

呼叫模板函式

void clearvector

& vt)

//臨時變數會被析構,temp呼叫vector析構函式釋放空間

效能分析:

主要比較三種插入方式:

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

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

C STL中的vector的記憶體分配與釋放

1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...

C STL中的vector的記憶體分配與釋放

1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...

C STL中的vector的記憶體分配與釋放

1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...