[C++][STL]容器的capacity、max_size以及內存分配


capacity - 容器的成員函數capacity()取得

max_size - 容器的成員函數max_size()取得

STL容器的capacity屬性,表示STL在發生realloc前能允許的最大元素數,也可以理解為預分配的內存空間。例如一個vector<int> v的capacity為5,當插入第6個元素時,vector會realloc,vector內部數據會復制到另外一個內存區域。這樣之前指向vector中的元素的指針、迭代器等等均會失效。

max_size屬性和capacity不同,表示STL容器允許的最大元素數,通常,這個數是一個很大的常整數,可以理解為無窮大。這個數目與平台和實現相關,在我的機器上vector<int>的max_size為1073741823,而string的max_size為4294967294。因為max_size很大~所以基本不會發生元素數超過max_size的情況,只需知道兩者區別即可。

設定capacity

List, Map/Multimap, Set/Multiset, Deque

並不是所有的容器都會發生realloc,List,Map/Multimap,Set/Multiset的元素在內存中散布,不預分配內存,所以不會產生realloc的情況,對於這些容器,其capacity是無意義的,所以這些容器沒有capacity()成員函數,也沒有capacity屬性。

deque雙向隊列情況比較特殊,deque將內存分塊,每次分配固定大小的分塊,一個分塊填充滿后開辟新的分塊,也屬於散布-連續混雜的情況,雖然deque會預分配內存空間,但也不會產生realloc(人家是alloc),所以也不具有capacity屬性。

Vector, String, basic_string<wchar_t>

實際具有capacity屬性的容器只有vector和string,在不同實現下,capacity也不盡相同。在我的機器上,情況如下:

vector<T>

默認構造函數 - capacity = 0

使用構造函數vector<T>(n, value=T())指定capacity - capacity = n

string  (basic_string<char> )

默認構造函數 - capacity = 15

沒有指定capacity的構造式

指定了初始字符串的 - capacity = 大於字符串長度且等於n*15-1

 basic_string<wchar_t>

默認構造函數 - capacity = 7

指定了初始字符串的 - capacity = 大於字符串長度且等於n*8-1

 

除了通過構造式設定capacity,也可以使用reserve(n)來設定容器對象的capacity,避免之后的realloc。不過這一過程是只增不減的,如果n小於當前capacity,則reserve(n)無效。

 

收縮容器的內存占用空間

Vector, String, basic_string<wchar_t>

對於vector和string,因為reserve()的效果是只增不減,所以無法通過reserve()來收縮空間。如需收縮內存空間,思路如下:

新建一個vector/string

為新建的vector/string填充原容器的內容

將原容器的變量名指向新的容器

實際使用中只需要一條語句即可。

    vector<int> v(10, 5);
    v.reserve(20);
    vector<int>(v).swap(v);

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM