7.使用reserve避免不必要的内存分配
vector、string可以自動(dòng)增長(zhǎng)來容納更多的元素。
每當(dāng)需要更多空間時(shí),就調(diào)用與realloc類似的操作。realloc操作分為4個(gè)部分:
涉及到內(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.切勿对STL容器的线程安全性有不切实
- 下一篇: 8.了解如何把vector和string