C 中 vector 如何實現記憶體分配

2021-06-03 19:10:10 字數 764 閱讀 3044

<>中對順序容器的記憶體分配是這樣描述的,內容太多,簡寫一下:

為了支援隨機訪問,vector中的元素採用順序存放,即每乙個元素緊挨著前乙個元素進行儲存。那麼現在只有可能出現問題了,當記憶體中沒有足夠連續的空間去存放新插入來的元素怎麼辦,c++是這樣處理的:重新分配記憶體空間,將原來舊的元素全部複製到新的儲存空間中去,然後再插入新的元素。因此可以看出,如果記憶體不是特別充足或者記憶體中沒有較大塊的空閒空間的,向vector容器中插入元素可能會有相當大的cpu開銷。其中最糟糕的情況是每次插入乙個元素,程式要將所有的元素複製到乙個新的記憶體塊上去,當然對於這種情況c++作了乙個折衷的處理:當我們插入元素時,如果老的記憶體塊是連續空閒空間不夠,則重新分配一塊記憶體空間,記憶體空間的大小不是只比舊的記憶體空間大乙個元素的大小,相反而是多分配幾個元素空間大小,這樣對於接下來的幾個新插入元素做到有空間可以插入,這樣之後使得vector的效能得到很大提高,不過這是乙個折衷的辦法。

上面分析完之後我們應該可以知道當呼叫push_back(tobj)時是如何分配記憶體的,即是在最大插入這個元素即可。不過vector也支援隨機插入元素,這要借用迭代器來完成這個工作了,看下面一段**,猜測一下會有什麼樣的輸出結果

vectorvec;

for(int i = 0; i < 10; i++)

vec.push_back(i);

vector::iterator it = vec.begin();

for(int i = 0; i < 5; i++)

it++;

cout<<&(*it)<<" "<<*it<

C 中vector記憶體擴充機制

為了支援隨機訪問,vector中的元素採用順序存放,即每乙個元素緊挨著前乙個元素進行儲存。那麼現在只有可能出現問題了,當記憶體中沒有足夠連續的空間去存放新插入來的元素怎麼辦,c 是這樣處理的 重新分配記憶體空間,將原來舊的元素全部複製到新的儲存空間中去,然後再插入新的元素。因此可以看出,如果記憶體不...

C 中vector容器的記憶體管理

vector是類模板,某種程度上可以看做是陣列的公升級版,但建立後仍可以改變大小。甚至 c primer 第4版 中還有這樣子的說法 從技術上說,在原來為空的vector容器上n次呼叫push back函式,從而建立擁有n個元素的vector容器,其執行時間永遠不能超過n的常量倍。大家也可能都知道,...

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

vecotr是動態陣列,顧名思義他可以動態的增加自己的長度。但是怎樣的增加自己的長度?vector有兩個函式乙個是capacity 返回記憶體空間即緩衝區的大小,另乙個是size 返回當前陣列中數的數量。vector增加元素來說,當容量已經不能放進資料了,那麼他會重新申請一塊記憶體,把之前的記憶體利...