c++中vector的一個特點是: 內存空間只會增長,不會減小。即爲了支持快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都挨着前一個元素存儲。設想,如果每次vector添加一個新元素時,爲了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣性能就會非常慢,所以,實際上分配時其容量要比當前所需容量更多,即vector預留了一些額外的存儲區,這樣就不必單獨爲每個新元素重新分配內存空間,減少開銷。 另外,在vector中內存只增不減體現在 - 比如首先分配了10000個字節,然後erase掉後面9999個,留下一個有效元素,但是實際上內存佔用仍然爲10000個,所有內存空間是在vector析構的時候才能被系統回收。所以,即使使用clear,vector所佔用的內存空間依然如故,無法保證內存的回收。
當然,對於數據量很小的vector,完全沒有必要進行主動釋放,就比如200 * 200的網格計算,就是沒有必要的,但是如果是1000 * 1000,那麼就是前者的25倍了,這時就需要進行主動內存釋放了。
另外,既然要進行內存釋放,我們不得不掌握size()和capacity()方法的區別,前者是實際的vector元素個數,後者是實際佔用內存的個數,一般來說,capacity()是大於或等於size()的。
所以,我們可以使用swap()來幫助釋放內存,具體方法如下:
#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
struct GrainRho
{
int key;
double rho;
};
int main() {
static vector<struct GrainRho> rhovec;
static vector<struct GrainRho>::iterator itrho;
GrainRho grainRho;
for (int i = 0; i < 100; i++) {
grainRho = {i, 0.5 + double(i)};
rhovec.push_back(grainRho);
}
rhovec.clear();
cout << "rhovec.size(): " << rhovec.size() << endl;
cout << "rhovec.capacity(): " << rhovec.capacity() << endl;
vector<struct GrainRho>().swap(rhovec);
grainRho = {1995, 6.28};
rhovec.push_back(grainRho);
cout << "rhovec.size(): " << rhovec.size() << endl;
cout << "rhovec.capacity(): " << rhovec.capacity() << endl;
system("pause");
}
如上所示,首先我們給這個rhovec存入了很多元素,然後調用clear()函數,但是實際上內存還是沒有釋放而是繼續佔用的,所以,我們使用 “vector().swap(rhovec)” 來釋放內存,最後又存入一個grainRho,所以最終結果只有一個grainRho佔用內存。
最終結果如下所示:
rhovec.size(): 0
rhovec.capacity(): 128
rhovec.size(): 1
rhovec.capacity(): 1