若char是一字節,int是4字節,指針類型是4字節,代碼如下:
class CTest
{
public:
CTest():m_chData(‘\0’),m_nData(0)
{
}
virtual void mem_fun(){}
private:
char m_chData;
int m_nData;
static char s_chData;
};
char CTest::s_chData=’\0’;
問:
(1)若按4字節對齊sizeof(CTest)的值是多少?
(2)若按1字節對齊sizeof(CTest)的值是多少?
類中:
啥都沒有,則佔用一個字節;一旦有其他成員佔用了空間,該1字節不計算在內;
只有成員函數,類函數不佔用空間,則還是隻佔用1個字節;
虛函數因爲存在一個虛函數表,需要4個字節;
數據成員對象如果爲指針則爲4字節,(字節對齊,如果爲13字節,四字節對其,空間應是4的倍數,則進位到16字節
空間);
static成員變量,static成員變量是存儲在靜態區當中的,它是一個共享的量;
enum:枚舉類型,一般以整型保存,一般聲明實例4字節,未聲明實例不計算在內
#pragma pack(2) 強制設定爲2字節對齊
union聯合體所佔的空間不僅取決於最寬成員,還跟所有成員有關係,
滿足條件:
1.必須要是其內部最大成員的整數倍,
2.結構體或union聯合的數據成員,第一個數據成員是要放在offset == 0的地方,如果遇上子成員,要根據子成員的類型存放在對應的整數倍的地址上
3.如果結構體作爲成員,則要找到這個結構體中的最大元素,然後從這個最大成員的整數倍地址開始存儲(strutc a中有一個struct b,b裏面有char,int,double….那b應該從8的整數倍開始存儲)
函數指針的問題,如果不加typedef,就是說這是類本身的函數指針,需要計算指針佔用空間;
如果加上typedef,說明這只是該函數指針的別名,不是類自己的指針,不計算在內