1. 程式人生 > >C++例題4--類的大小判定--sizeof

C++例題4--類的大小判定--sizeof

若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,說明這只是該函式指標的別名,不是類自己的指標,不計算在內