C++類的內存分配

今天面試被問到一個類的內存問題,有些記不清楚了。用了 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.繼承的狀況

繼承的狀況下,子類的字節數就是父類加子類.

但須要注意的一點是,子類只有一份虛函數表指針,指向的表中是父類虛函數加子類虛函數

相關文章
相關標籤/搜索