日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7.使用reserve避免不必要的内存分配

發(fā)布時(shí)間:2024/4/18 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7.使用reserve避免不必要的内存分配 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

vector、string可以自動(dòng)增長(zhǎng)來容納更多的元素。

每當(dāng)需要更多空間時(shí),就調(diào)用與realloc類似的操作。realloc操作分為4個(gè)部分:

  • 分配一塊大小為當(dāng)前容量的某個(gè)倍數(shù)的新內(nèi)存。在大多數(shù)實(shí)現(xiàn)中,vector和string的容量每次以2的倍數(shù)增長(zhǎng),即每當(dāng)容器需要擴(kuò)張是,它們的容量即加倍。
  • 把容器的所有元素從舊的內(nèi)存中拷貝到新的內(nèi)存中。
  • 析構(gòu)掉內(nèi)存中的對(duì)象。
  • 釋放舊內(nèi)存。
  • 涉及到內(nèi)存的分配、釋放、拷貝、析構(gòu)等步驟,這個(gè)過程將非常耗時(shí)。

    reserve()可以使重新分配的次數(shù)降低,只有當(dāng)元素個(gè)數(shù)等于當(dāng)前容量時(shí)仍需插入才會(huì)重新分配。

    與容量和大小相關(guān)的4個(gè)成員函數(shù):

    • size():當(dāng)前容器中有多少個(gè)元素。
    • capacity() :當(dāng)前分配的內(nèi)存最多可以容納多少個(gè)元素。
    • resize(n):改變當(dāng)前容器中已有元素的個(gè)數(shù),即size() = n。如果n > size(), 使用默認(rèn)構(gòu)造函數(shù)構(gòu)造n-size()個(gè)元素。如果n < size(),析構(gòu)多出的size()-n個(gè)元素。函數(shù)調(diào)用之后,size() = n。
    • reserve(n):強(qiáng)迫容器把它的容量變?yōu)橹辽偈莕,前提是n不小于當(dāng)前的大小。這通常會(huì)導(dǎo)致重新分配,因?yàn)槿萘啃枰黾印?如果n比當(dāng)前的容量小,則vector忽略該調(diào)用,什么都不做;而string則可能把自己的容量減為size()和n中的最大值,但是string的大小肯定不變。)

    當(dāng)一個(gè)元素需要被插入而容器的容量不夠時(shí),就會(huì)發(fā)生重新分配過程。因此,避免重新分配的關(guān)鍵在于,盡早地使用reserve,把容器的容量設(shè)為足夠大的值,最好是在容器剛被構(gòu)造出來之后就使用reserve

    原來的代碼:

    std::vector<int> datas; for (int idx = 0; idx < 1000; ++idx)datas.push_back(idx);?

    這個(gè)操作會(huì)導(dǎo)致2-10次的重新分配。

    修改如下:

    std::vector<int> datas; datas.reserve(1000); for (int idx = 0; idx < 1000; ++idx)datas.push_back(idx);?

    這個(gè)操作將不會(huì)發(fā)生重新分配,效率大幅度提升。

    通常有兩種方式來使用reserve以避免不必要的重新分配。
    第一種方式是,若能夠確定知道或大致預(yù)計(jì)容易中最終會(huì)有多少個(gè)元素,則此時(shí)可使用reserve。在這種情況下,就像上面代碼中的vector一樣,你可以簡(jiǎn)單地預(yù)留適當(dāng)大小的空間。
    第二種方式是,先預(yù)留足夠大的空間,然后,當(dāng)把所有數(shù)據(jù)都加入以后,再去除多余的容量。

    總結(jié)

    以上是生活随笔為你收集整理的7.使用reserve避免不必要的内存分配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。