Effective STL 條款14

使用reserve來避免不必要的重新分配

本節講解reserve操作的優勢,以及重新分配的代價

先來講一下重新分配的代價:
1.分配新的內存塊,一般vector和string是成倍增加內存

2.把所有元素從容器的舊內存拷貝到它的新內存

3.銷燬舊內存對象

4.回收舊內存

可以看出,重新分配內存的操作是非常耗時的。

接着,解釋一下以下幾個迭代器函數的功能:

1.size告訴你容器中有多少元素

2.capacity告訴你容器中最多能容納多少元素

3.resize函數強制把容器容量改爲容納n個元素,如果n小於當前size返回大小,容器尾部的元素會被銷燬。如果n大於當前size大小,新默認的元素會添加到容器尾部。如果n大於當前capacity,在元素加入之前發生重新分配

4.reserve強制容器的容量改爲至少n,如果n小於當前容量,vector忽略,n大於就重新分配內存。

最後,比較下面兩個代碼:
代碼1:

vector<int>v;
for(int i=1;i<=1000;i++) 
   v.push_back(i);

代碼2:

vector<int>v;
v.reserve(1000);
for(int i=1;i<=1000;i++) 
   v.push_back(i);

代碼1會導致2到10次重新分配
代碼2不會導致重新分配

爲了提高程序執行速度,避免容器內存重新分配很重要!

發佈了152 篇原創文章 · 獲贊 182 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章