2014-08-28 58 views
0

如何確定對象的運行時大小?C++對象的動態大小

我們不是在談論size of the type而是一個對象,可以在執行過程中變化的實際大小,如:

vector<int> v; 
auto a = MagicSizeF(v); // magic size function 
v.push_back(2); 
v.push_back(2); 
// this should hold - ok there's small consainer optimizations and initial 
// vector capacity and implementation details, but you get what I mean 
assert(MagicSizeF(v) > a); 

在矢量情況下,它可以像這樣實現:

template<typename T> 
auto MagicSizeF(vector<T> const& v) { 
    return v.size()*sizeof(T); // or v.capacity() to be strict 
    // other implementation details memory consumers could be added 
} 

但是有沒有一個標準/通用的方法來做到這一點的任意類型的對象? ABI是否需要繞過所有的實施細節?

+2

與您的實際問題無關,但對於'std :: vector',小緩衝區優化是不可能的,因爲不允許使用swap()來使迭代器無效。 – Praetorian 2014-08-28 07:55:51

回答

4

不,沒有通用的方法來做到這一點,因爲您需要一種通用的方法來識別對象內的指針並查找對象的大小。如果你發現一個void *會怎麼樣?如果你找到一個指向數組的指針呢?在某些情況下,你甚至無法計算這些東西的大小!

+3

另外,你不能說指向的對象實際上屬於它指向的對象。如果你按照你遇到的每一個指針並且總結出你找到的元素,當你有兩個對象指向對方時,你會得到無限大小。如果你考慮一些方法來避免重複計算對象,那麼葉子的「MagicSize」仍然是整個* forest *的大小,這通常不是你所需要的,並且使得該函數非常沒用。 – 2014-08-28 07:56:40

+0

@ArneMertz:很對。這些問題非常類似那些無法模仿的Raymond Chen詳細討論的問題,在這裏:http://blogs.msdn.com/b/oldnewthing/archive/2004/12/28/336219.aspx – 2014-08-28 08:12:55