最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++之vector容器的swap方法解讀

 更新時間:2023年08月09日 10:17:00   作者:我想造輪子  
這篇文章主要介紹了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是一個用來托管內(nèi)存的對象池,_managedObjectArray是一個std::vector<Ref*>類型的成員,用來保存所有管理的對象,這幾行代碼要做的事情就是:遍歷所有對象,依次調(diào)用他們的release()方法,最后清空這個vector。

但是注意到這兩句:

std::vector<Ref*> releasings;
releasings.swap(_managedObjectArray);

把一個默認(rèn)的臨時對象和原有的成員進(jìn)行了swap,然后對交換后的臨時對象進(jìn)行遍歷。

這看起來好像是有點(diǎn)多余?

為什么不直接遍歷_managedObjectArray,然后再調(diào)用其clear()方法呢?

《Effective STL》第17條:從vector中刪除元素縮減了該vector的大小(size),但是并沒有減小它的容量(capacity)。

了解STL的同學(xué)都知道size和capacity的區(qū)別,那么這里的swap調(diào)用就能清楚作者意圖了:遍歷完vector后還要釋放其所占的內(nèi)存,簡單地調(diào)用clear方法并不能解決問題。

swap方法的原理是交換兩個vector的內(nèi)部指針以達(dá)到“交換整個容器”的效果,所以在和默認(rèn)的臨時變量swap后,成員變量_managedObjectArray確實(shí)是個空的容器(包括內(nèi)存),

臨時變量在函數(shù)結(jié)束時析構(gòu),而vector正是在其析構(gòu)函數(shù)中釋放內(nèi)存的,所以在函數(shù)結(jié)束時,所有多余的內(nèi)存都被釋放,一切安好!

同學(xué)們記住了,這樣的技巧可以用來清空一個vector的內(nèi)存:

vector<T>().swap(_vectorToBeReleased);

其效果等價于(注意花括號):

{
    vector<T> temp;
    temp.swap(_vectorToBeReleased);
}

該技巧同樣適用于std::string。

C++ vector容器 巧用swap函數(shù)收縮內(nèi)存

學(xué)vector容器互換時發(fā)現(xiàn)swap函數(shù)還能用來收縮內(nèi)存,記錄一下

首先先隨意創(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;

結(jié)果如下:

接著重新設(shè)置一下容器的大小

v.resize(3);
cout<<"v的容量為:"<<v.capacity()<<endl;
cout<<"v的大小為:"<<v.size()<<endl;

結(jié)果如下:

可以看到此時容器容量是遠(yuǎn)大于大小的,造成了內(nèi)存浪費(fèi)

用swap函數(shù)收縮內(nèi)存:

vector<int>(v).swap(v);
cout<<"v的容量為:"<<v.capacity()<<endl;
cout<<"v的大小為:"<<v.size()<<endl;

運(yùn)行結(jié)果:

完美收縮內(nèi)存

接下來解釋一下代碼:

首先vector<int>(v)是利用了v初始化了一個匿名對象,這個匿名對象會按照容器v中實(shí)際元素個數(shù)去初始化,及容量以及大小均為3

而后匿名對象再調(diào)用swap函數(shù)實(shí)現(xiàn)與容器v的互換,原本的容器v就會指向這個容量大小均為3的內(nèi)存塊

匿名對象現(xiàn)在就指向了容量較大的內(nèi)存塊,由于匿名對象的特性,該行結(jié)束后,系統(tǒng)會自動回收匿名對象占用的內(nèi)存,從而實(shí)現(xiàn)了內(nèi)存收縮

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

宁阳县| 喜德县| 嘉兴市| 原平市| 平潭县| 安国市| 兰州市| 荃湾区| 佛冈县| 万安县| 阳新县| 涿鹿县| 湖南省| 东源县| 宁陵县| 喀喇沁旗| 克山县| 峨眉山市| 杭锦旗| 永城市| 洛川县| 苏尼特右旗| 闻喜县| 塔河县| 湖州市| 安吉县| 北宁市| 阿鲁科尔沁旗| 佛山市| 宝丰县| 柘荣县| 大足县| 淳化县| 仁布县| 武威市| 桦南县| 库尔勒市| 左权县| 会理县| 依安县| 乃东县|