標籤:cap swa 訪問 容量 push 很多 system 析構 city
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<struct GrainRho>().swap(rhovec)” 來釋放記憶體,最後又存入一個grainRho,所以最終結果只有一個grainRho佔用記憶體。
最終結果如下所示:
rhovec.size(): 0rhovec.capacity(): 128rhovec.size(): 1rhovec.capacity(): 1
如上所示,我們就很好的解決了記憶體佔用問題!
c++ vector的記憶體釋放