2015-02-10 26 views
2

是否有一種通用的方法(不依賴於平臺)在編譯時獲得內存中類對象的大小,而不計算vtable指針?確定沒有虛表指針的對象的大小

+3

出了什麼問題'sizeof'?它不包括vtable的大小,只包含指向vtable的指針的大小(如果有的話)。 – dasblinkenlight 2015-02-10 14:23:55

+0

減法?如果有多個呢? – Reflection 2015-02-10 14:29:20

+1

出於好奇:爲了什麼? – Angew 2015-02-10 14:43:45

回答

1

正如你所要求的便攜方式:

class MyClass 
{ 
private: 
    struct S 
    { 
    DataMemberType1 dataMember1; 
    ... 
    DataMemberTypeN dataMemberN; 
    } m; 

public: 
    static const size_t MemberSize = sizeof(S); 
}; 
+0

你確定這是100%的可移植性和'sizeof MyClass) - sizeof(S)'將始終與vpointer的大小完全相同? – 2015-02-10 14:45:55

+0

@Neil:我的解決方案避免了實現的具體細節。簡要介紹一下「C++對象如何在內存中佈局?」 [鏈接](http://www.stroustrup.com/bs_faq2.html#layout-obj)。 – 2015-02-10 15:02:46

+0

那不回答我的問題..如果有填充? – 2015-02-10 15:05:43

1

在這個class上使用sizeof,它不包括vtable只是指針的大小。

+1

我討論了vtable指針。編輯的問題。 – Reflection 2015-02-10 14:30:51

+0

@PaulEvans對於任何具有虛函數的對象(任何實際包含虛表的對象),你的答案都是錯誤的。http://ideone.com/7y48aO – 2015-07-14 12:24:21

+0

@JonathanMee答案是正確的;類實例包含一個vptr(vtable指針的簡寫)** not **一個vtable(類的虛函數的函數指針表+ RTTI info +虛擬基地偏移量) – curiousguy 2015-08-01 00:52:04