類所占內存的大小是由成員變量(靜態變量除外)決定的,成員函數(這是籠統的說,后面會細說)是不計算在內的。
(一)
class CBase
{
};
sizeof(CBase)=1;
為什么空的什么都沒有是1呢?
c++要求每個實例在內存中都有獨一無二的地址。//注意這句話!!!!!!!!!!
空類也會被實例化,所以編譯器會給空類隱含的添加一個字節,這樣空類實例化之后就有了獨一無二的地址了。
所以空類的sizeof為1。
{
int a;
char p;
};
sizeof(CBase)=8;
記得 對齊的問題 。int 占4字節//注意這點和struct的對齊原則很像!!!!!
char占一字節,補齊3字節
(三)
class CBase
{
public:
CBase(void);
virtual ~CBase(void);
private:
int a;
char *p;
};
再運行:sizeof(CBase)=12
C++ 類中有虛函數的時候有一個指向虛函數的指針(vptr),在32位系統分配指針大小為4字節。無論多少個虛函數,只有這一個指針,4字節。//注意一般的函數是沒有這個指針的,而且也不占類的內存。
(四)
class CChild : public CBase
{
public:
CChild(void);
~CChild(void);
virtual void test();
private:
int b;
};
輸出:sizeof(CChild)=16;
可見子類的大小是本身成員變量的大小加上父類的大小。//其中有一部分是虛擬函數表的原因,一定要知道
父類子類共享一個虛函數指針
(五)
總結:
空的類是會占用內存空間的,而且大小是1,原因是C++要求每個實例在內存中都有獨一無二的地址。
(一)類內部的成員變量:
- 普通的變量:是要占用內存的,但是要注意對齊原則(這點和struct類型很相似)。
- static修飾的靜態變量:不占用內容,原因是編譯器將其放在全局變量區。
- 普通函數:不占用內存。
- 虛函數:要占用4個字節,用來指定虛函數的虛擬函數表的入口地址。所以一個類的虛函數所占用的地址是不變的,和虛函數的個數是沒有關系
http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html
