今天面試被問到一個類的內存問題,有些記不清楚了。用了 C++這麼年,實在是不該該。面試
因而上網查了一些資料,並作了實驗,整理以下:函數
所用測試環境爲64位mac air,編譯器爲XCode測試
1.最簡單this
class Test { public: int a ; };
printf("size=%d\n",sizeof(Test));
這個相信你們都能猜獲得。答案是4.這個不解釋。spa
值得一提的是,設計
Test t; printf("%d,%d",&t,&(t.a));
t,和t.a的地址是同樣的指針
2.加上成員函數 code
class Test { public: int a ; int tt(){return 0;} };
這個可能有些難度 。有人猜是4,有人猜是8,或者其它。對象
這個仍然是4,緣由是成員函數並不屬於類(或者說對象),全部的成員函數和全局函數等,都在代碼段。因此在調用成員函數時,會隱式的傳個this過去,這個this做用其實就是將對象內全部成員變量傳遞進去。blog
關於這一點,讀過《Lua程序設計》的「面向對象」一章的同窗,可能會有更深入的體會。
3.static
class Test { public: int a ; static int b ; int tt(){return 0;} };
結果仍然是4,static 變量不佔用內存??
不是的,static 變量存放在靜態區,並不和普通成員變量在一個區域,因此仍然是4.
4.增長virtual
class Test { public: int a ; virtual int tt(){return 0;} };
增長一個virtual ,會增長一個虛函數表指針(即便有多個虛函數,也僅有一個虛函數表)
一個有趣的問題是,一個指針佔用多少個字節,是4 個字節 嗎?
不是的,其實和機器字長有關,在32位機器上是4字節,若是在64位機器上,則是8個字節 。
因此在個人編譯環境下,這個的答案應該是12
5.繼承的狀況
繼承的狀況下,子類的字節數就是父類加子類.
但須要注意的一點是,子類只有一份虛函數表指針,指向的表中是父類虛函數加子類虛函數