當前位置:
首頁 >
7.使用reserve避免不必要的内存分配
發布時間:2024/4/18
82
豆豆
生活随笔
收集整理的這篇文章主要介紹了
7.使用reserve避免不必要的内存分配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
vector、string可以自動增長來容納更多的元素。
每當需要更多空間時,就調用與realloc類似的操作。realloc操作分為4個部分:
涉及到內存的分配、釋放、拷貝、析構等步驟,這個過程將非常耗時。
reserve()可以使重新分配的次數降低,只有當元素個數等于當前容量時仍需插入才會重新分配。
與容量和大小相關的4個成員函數:
- size():當前容器中有多少個元素。
- capacity() :當前分配的內存最多可以容納多少個元素。
- resize(n):改變當前容器中已有元素的個數,即size() = n。如果n > size(), 使用默認構造函數構造n-size()個元素。如果n < size(),析構多出的size()-n個元素。函數調用之后,size() = n。
- reserve(n):強迫容器把它的容量變為至少是n,前提是n不小于當前的大小。這通常會導致重新分配,因為容量需要增加。(如果n比當前的容量小,則vector忽略該調用,什么都不做;而string則可能把自己的容量減為size()和n中的最大值,但是string的大小肯定不變。)
當一個元素需要被插入而容器的容量不夠時,就會發生重新分配過程。因此,避免重新分配的關鍵在于,盡早地使用reserve,把容器的容量設為足夠大的值,最好是在容器剛被構造出來之后就使用reserve。
原來的代碼:
std::vector<int> datas; for (int idx = 0; idx < 1000; ++idx)datas.push_back(idx);?這個操作會導致2-10次的重新分配。
修改如下:
std::vector<int> datas; datas.reserve(1000); for (int idx = 0; idx < 1000; ++idx)datas.push_back(idx);?這個操作將不會發生重新分配,效率大幅度提升。
通常有兩種方式來使用reserve以避免不必要的重新分配。
第一種方式是,若能夠確定知道或大致預計容易中最終會有多少個元素,則此時可使用reserve。在這種情況下,就像上面代碼中的vector一樣,你可以簡單地預留適當大小的空間。
第二種方式是,先預留足夠大的空間,然后,當把所有數據都加入以后,再去除多余的容量。
總結
以上是生活随笔為你收集整理的7.使用reserve避免不必要的内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.切勿对STL容器的线程安全性有不切实
- 下一篇: 8.了解如何把vector和string