一直以來在各個論壇上都不時的見過一些關於類大小的討論,尤其是當涉及到虛繼承時,類的大小就變得更加撲朔迷離,每看完乙個帖子都覺得自己有所收穫,但當下次遇到類似的帖子時卻怎麼也想不起自己以前對此問題的記憶了,於是乎,乾脆勤快些一勞永逸地把他們記錄下來。
純屬個人理解,難免有錯,我會定期更新這篇文章,修改其中的錯誤之處。
關於類的大小問題,有些是和編譯器有關的。很多技術取決於編譯器的具體實現。所以編譯器不同,得到的結果有時會有所出入。下面所有的測試不加宣告的話都是基於vs2005。
為使問題更加清晰,下面的討論將不考慮對齊問題。
#pragma pack(1)
class a ;
class b: virtual public a;
class c: virtual public a{};
class d: public b, public c{};
#pragma pack()
int main(int argc, char *argv)
輸出結果是: 5
10 9
14理解以上問題的關鍵在於了解編譯器
對於虛函式以及虛基類的處理方法。
記得我第一次了解涉及到虛函式的類的記憶體布局是在lipperman的
中,中文版是由侯捷翻譯的。書中講到微軟使用的所謂虛函式表,用來儲存虛函式指標,這個估計大家都了解。其實虛函式表還有另乙個用途就是用來儲存虛基類的指標。
指向虛基類的指標是以負數為下標存貯在虛表中的。
b的大小a的大小加上乙個虛函式表指標的大小和乙個b中成員變數的大小,也就是10。
c同理。
d的記憶體布局大致如下:
c 類的大小問題
先看一段 include include include include struct a class x class y public x class b int main 解釋 第乙個sizeof a 的大小是因為記憶體分配的效率問題,所以都會以類裡面占用位元組最大的 基本型別 double 為...
關於Canvas畫布大小問題
1.canvas大小預設為300x150 mycanvas style background color rgb 218,108,108 canvas var canvas document.getelementbyid mycanvas var context canvas.getcontext ...
結構體和類的大小問題
看這樣乙個筆試題 include using namespace std pragma pack 8 struct example1 struct example2 pragma pack int main int argc,char argv 問程式的輸出結果是什麼?答案是 8,16,4 stru...