代碼回顧
union aa {
float x;
float y;
char c[6];
};
struct st {
union aa v;
float s[5];
double ave;
} w;
逐步計算
- union aa 大小:
- 成員:
float (4B)、float (4B)、char[6] (6B)。
- union 大小 = 最大成員大小 = 6B,但需滿足對齊要求:union 對齊數 = 最大成員對齊數 = 4 (float)。
- 6 不是 4 的倍數,向上取整到 8B。→ union aa = 8 字節。
- float s[5] 大小:5 × 4 = 20B。起始偏移需 4 字節對齊。union 結束於偏移 8,20 從偏移 8 開始已對齊。→ 佔 20 字節,偏移 8~27。
- double ave 大小:8B,需 8 字節對齊。
s[5] 結束於偏移 28(8+20),28 不是 8 的倍數,需填充 4 字節對齊到 32。→ 填充 4B,ave 佔 8B,偏移 32~39。
- 結構體總大小:最後一個成員結束於偏移 40。結構體整體大小需是最大對齊數 (8) 的倍數,40 已滿足。→ 總計 40 字節。
內存佈局圖
偏移 0-7 : union aa (8B)
偏移 8-27 : float s[5] (20B)
偏移 28-31 : 填充 (4B) // 為 double 對齊
偏移 32-39 : double ave (8B)
總大小 : 40B
關鍵規則總結
- union 大小 = max(成員大小) 向上取整到 max(成員對齊數) 的倍數。
- 結構體成員按聲明順序排列,每個成員起始偏移必須是其對齊數的倍數(必要時插入填充字節)。
- 結構體總大小 = 最大成員對齊數的倍數(尾部填充)。
#pragma pack(n) 可強制修改對齊數,但可能導致性能下降或硬體異常。