C++之vector容器的swap方法解讀
C++ vector容器的swap方法
剛才在研究cocos2d-x源碼時,遇到這么幾行代碼:
void AutoreleasePool::clear()
{
std::vector<Ref*> releasings;
releasings.swap(_managedObjectArray);
for (const auto &obj : releasings)
{
obj->release();
}
}AutoreleasePool是一個用來托管內存的對象池,_managedObjectArray是一個std::vector<Ref*>類型的成員,用來保存所有管理的對象,這幾行代碼要做的事情就是:遍歷所有對象,依次調用他們的release()方法,最后清空這個vector。
但是注意到這兩句:
std::vector<Ref*> releasings; releasings.swap(_managedObjectArray);
把一個默認的臨時對象和原有的成員進行了swap,然后對交換后的臨時對象進行遍歷。
這看起來好像是有點多余?
為什么不直接遍歷_managedObjectArray,然后再調用其clear()方法呢?
《Effective STL》第17條:從vector中刪除元素縮減了該vector的大小(size),但是并沒有減小它的容量(capacity)。
了解STL的同學都知道size和capacity的區(qū)別,那么這里的swap調用就能清楚作者意圖了:遍歷完vector后還要釋放其所占的內存,簡單地調用clear方法并不能解決問題。
swap方法的原理是交換兩個vector的內部指針以達到“交換整個容器”的效果,所以在和默認的臨時變量swap后,成員變量_managedObjectArray確實是個空的容器(包括內存),
臨時變量在函數(shù)結束時析構,而vector正是在其析構函數(shù)中釋放內存的,所以在函數(shù)結束時,所有多余的內存都被釋放,一切安好!
同學們記住了,這樣的技巧可以用來清空一個vector的內存:
vector<T>().swap(_vectorToBeReleased);
其效果等價于(注意花括號):
{
vector<T> temp;
temp.swap(_vectorToBeReleased);
}該技巧同樣適用于std::string。
C++ vector容器 巧用swap函數(shù)收縮內存
學vector容器互換時發(fā)現(xiàn)swap函數(shù)還能用來收縮內存,記錄一下
首先先隨意創(chuàng)建一個比較大的容器:
vector<int>v;
for(int i=0;i<100000;i++){
v.push_back(i);
}
//輸出看看容量及大小
cout<<"v的容量為:"<<v.capacity()<<endl;
cout<<"v的大小為:"<<v.size()<<endl;結果如下:

接著重新設置一下容器的大小
v.resize(3); cout<<"v的容量為:"<<v.capacity()<<endl; cout<<"v的大小為:"<<v.size()<<endl;
結果如下:

可以看到此時容器容量是遠大于大小的,造成了內存浪費
用swap函數(shù)收縮內存:
vector<int>(v).swap(v); cout<<"v的容量為:"<<v.capacity()<<endl; cout<<"v的大小為:"<<v.size()<<endl;
運行結果:

完美收縮內存
接下來解釋一下代碼:
首先vector<int>(v)是利用了v初始化了一個匿名對象,這個匿名對象會按照容器v中實際元素個數(shù)去初始化,及容量以及大小均為3
而后匿名對象再調用swap函數(shù)實現(xiàn)與容器v的互換,原本的容器v就會指向這個容量大小均為3的內存塊
匿名對象現(xiàn)在就指向了容量較大的內存塊,由于匿名對象的特性,該行結束后,系統(tǒng)會自動回收匿名對象占用的內存,從而實現(xiàn)了內存收縮
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C語言全方位講解指針與地址和數(shù)組函數(shù)堆空間的關系
指針是C語言中一個非常重要的概念,也是C語言的特色之一。使用指針可以對復雜數(shù)據(jù)進行處理,能對計算機的內存分配進行控制,在函數(shù)調用中使用指針還可以返回多個值2022-04-04
C++實現(xiàn)LeetCode(6.字型轉換字符串)
這篇文章主要介紹了C++實現(xiàn)LeetCode(6.字型轉換字符串),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07
c++將數(shù)組名作為函數(shù)參數(shù)對數(shù)組元素進行相應的運算
這篇文章主要介紹了c++將數(shù)組名作為函數(shù)參數(shù)對數(shù)組元素進行相應的運算,需要的朋友可以參考下2014-05-05

