今天面試被問到一個類的內存問題,有些記不清楚了。用了 C++這么年,實在是不應該。
於是上網查了一些資料,並做了實驗,整理如下:
所用測試環境為64位mac air,編譯器為XCode
1.最簡單
class Test { public: int a ; };
printf("size=%d\n",sizeof(Test));
這個相信大家都能猜得到。答案是4.這個不解釋。
值得一提的是,
Test t; printf("%d,%d",&t,&(t.a));
t,和t.a的地址是一樣的
2.加上成員函數
class Test { public: int a ; int tt(){return 0;} };
這個可能有些難度 。有人猜是4,有人猜是8,或者其它。
這個仍然是4,原因是成員函數並不屬於類(或者說對象),所有的成員函數和全局函數等,都在代碼段。所以在調用成員函數時,會隱式的傳個this過去,這個this作用其實就是將對象內所有成員變量傳遞進去。
關於這一點,讀過《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.繼承的情況
繼承的情況下,子類的字節數就是父類加子類.
但需要注意的一點是,子類只有一份虛函數表指針,指向的表中是父類虛函數加子類虛函數