2016-06-29 62 views
-1

據我所知,我們可以用size()函數來獲取矢量大小,例如:如何知道std :: vector的分配內存大小?

std::vector<in> abc; 
    abc.resize(3); 
    abc.size(); 

的我的問題是我怎麼能知道一個向量的內存大小?舉個例子:

std::vector<int> abc; 
abc.reserve(7); 
//the size of memory that has been allocated for abc 
+0

http://en.cppreference.com/w/cpp/container/vector – juanchopanza

回答

3

您使用成員函數capacity()獲得分配的容量

std::vector<int> abc; 
abc.reserve(7); 
std::cout << abc.capacity() << std::endl; 

要獲取以字節爲單位分配的內存,你可以這樣做:

sizeof(int) * abc.capacity(); 

這給出,你知道你的value_typeint。如果你不這樣做

sizeof(decltype(abc.back())) * abc.capacity(); 
+2

請注意,由'capazcity'(和「size」)返回的大小是以元素數量爲單位的,而不是以字節爲單位,如果內存。 – user2079303

+1

或更一般地說'sizeof(decltype(abc.front())* abc.capacity)' – Curious

+0

對象的大小是否包含填充? – mksteve

0

上有內存強硬的聲明是連續的,所以大小

sizeof(abc[0]) * abc.capacity(); 

( (char*)(&abc[1]) - (char*)(&abc[0])) * abc.capacity(); 
+0

爲什麼建議第二種方法?它比較複雜,對第一個沒有任何優勢,我認爲在技術上UB如果數組不包含至少兩個元素。第一個很好。 – user2079303

+0

您不能依賴sizeof(abc [0])== sizeof(T)。 Operator []可以返回一個代理對象。你最好用'value_type'。 –

+1

@CrazyEddie:在你可能想到的情況下,'vector ',你不能指望'sizeof(value_type)* capacity()'是實際分配的內存量。 –

0

由於std :: vector可以存儲複雜的對象(如std :: stri ng),它們有內部存儲器管理並可能分配額外的內存,因此確定總內存使用率可能很難。

對於包含簡單對象的載體如INT,使用容量的sizeof將工作,雖然所建議的解決方案。

1

真正的答案是你不能。其他人建議的方法通常會起作用,但你不能依賴任何反映分配的實際內存的capacity

首先,堆會經常分配比請求更多的內存。這與針對碎片的優化有關...... vector無法知道實際分配了多少內存,只有它所請求的內存。

所以capacity最好給你一個非常粗略的估計。

相關問題