2014年5月2日 星期五

[C/C++] struct 和 union 的sizeof相關判斷方式

sizeof 相關整理
            32bit    64bit(LLP64)    64bit(LP64)
char         1        1                1            byte
short        2        2                2
int            4        4                4
pointer     4        8                8
long         4        4                8


struct 對齊的size判斷
1. #pragma pack(4) 超過最大成員型別的size以 最大成員型別的size 為區塊依據 (4 byte表示記憶體一次讀取4 byte)
2. 成員順序會影響struct的總大小
3. 一個成員不能拆開在不同區塊
4. 區塊空間足夠才可合併,例如char和short可合併在區塊大小為4 byte的空間
5. struct中的struct/union 須考慮子層的最大型別再對齊


union 對齊的size判斷
1. #pragma pack(4) 超過最大成員型別的size以 最大成員型別的size 為區塊依據 (4 byte表示記憶體一次讀取4 byte)
2. 以最大size的成員直接當成union的size (因空間共用)
3. 若最大size的成員型別(char)不是 成員當中型別最大的(int),則須對齊

PS. 若子層的struct/union沒有實體化只單純宣告 則不占空間, 反之有給定變數則要計算

// 例一
struct B   

    union A  // 不占空間
    { 
        int t;   //4 
        short m; //2 
        char p;  //1 
    } ;          // } AA; 若有給定名稱(實體化)則要計算
    double c;    //8 
    char p2;     //1 
}; 
// sizeof(B) = 8+8 = 16

// 例二
union A

    int t;   //4 
    short m; //2 
    char p;  //1 
} ; 
struct B   

    A a;    //4 有實體化
    double c;    //8 
    char p2;     //1 
};
// sizeof(B) = 8+8+8 = 24

沒有留言: