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

發佈了48 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章