C++類的內存分配


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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM