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
沒有留言:
張貼留言