C++例題4--類的大小判定--sizeof
阿新 • • 發佈:2019-01-31
若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成員變數是儲存在靜態區當中的,它是一個共享的量;
sizeof的本質是得到某個型別的大小,確切的來說就是當建立這個型別的一個物件(或變數)的時候,需要為它分配的空間的大小。因此,在為這個類建立一個例項物件的時候,是無需再為static成員變數分配空間的,所以,這個類的例項物件所需要分配的空間是要排除static成員變數的,於是,當sizeof計算類的大小的時候會忽略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,說明這只是該函式指標的別名,不是類自己的指標,不計算在內