據我所知,我們可以用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
據我所知,我們可以用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
您使用成員函數capacity()
獲得分配的容量
std::vector<int> abc;
abc.reserve(7);
std::cout << abc.capacity() << std::endl;
要獲取以字節爲單位分配的內存,你可以這樣做:
sizeof(int) * abc.capacity();
這給出,你知道你的value_type
是int
。如果你不這樣做
sizeof(decltype(abc.back())) * abc.capacity();
請注意,由'capazcity'(和「size」)返回的大小是以元素數量爲單位的,而不是以字節爲單位,如果內存。 – user2079303
或更一般地說'sizeof(decltype(abc.front())* abc.capacity)' – Curious
對象的大小是否包含填充? – mksteve
使用capacity
成員函數 - http://en.cppreference.com/w/cpp/container/vector/capacity
上有內存強硬的聲明是連續的,所以大小
sizeof(abc[0]) * abc.capacity();
或
( (char*)(&abc[1]) - (char*)(&abc[0])) * abc.capacity();
爲什麼建議第二種方法?它比較複雜,對第一個沒有任何優勢,我認爲在技術上UB如果數組不包含至少兩個元素。第一個很好。 – user2079303
您不能依賴sizeof(abc [0])== sizeof(T)。 Operator []可以返回一個代理對象。你最好用'value_type'。 –
@CrazyEddie:在你可能想到的情況下,'vector
由於std :: vector可以存儲複雜的對象(如std :: stri ng),它們有內部存儲器管理並可能分配額外的內存,因此確定總內存使用率可能很難。
對於包含簡單對象的載體如INT,使用容量和的sizeof將工作,雖然所建議的解決方案。
真正的答案是你不能。其他人建議的方法通常會起作用,但你不能依賴任何反映分配的實際內存的capacity
。
首先,堆會經常分配比請求更多的內存。這與針對碎片的優化有關...... vector
無法知道實際分配了多少內存,只有它所請求的內存。
所以capacity
最好給你一個非常粗略的估計。
http://en.cppreference.com/w/cpp/container/vector – juanchopanza