struct A { int a; char b; short c; }; // 4 + 1 + (1填充) + 2 = 8
struct B { char b; int a; short c; }; // 1 + (3填充) + 4 + 2 + (2填充) = 12
struct B 詳細佈局 (起始位址 0x0,預設 pack=4):
| 成員 | 自身對齊 | 有效對齊 | 偏移量 | 大小 | 填充 |
|---|---|---|---|---|---|
| b (char) | 1 | 1 | 0x0 | 1 | 0 |
| a (int) | 4 | 4 | 0x4 | 4 | 3 (0x1-0x3) |
| c (short) | 2 | 2 | 0x8 | 2 | 0 |
| 結構體有效對齊 = max(1,4,2) = 4 | |||||
| 當前大小 10,非 4 倍數 → 尾部填充 2 字節 → 總大小 12 | |||||
#pragma pack(push) // 保存當前狀態
#pragma pack(2) // 最大對齊 2 字節
struct C { char b; int a; short c; }; // 大小 = 8
#pragma pack(pop) // 恢復
#pragma pack(1) // 緊密堆積
struct D { char b; int a; short c; }; // 大小 = 7 (無填充)
#pragma pack()
#pragma pack(8)
struct example1 { short a; long b; }; // short=2, long=4, max=4 → pack(8) 無效,實際 4
struct example2 { char c; example1 s; short e; };
#pragma pack()
// example1: a(0-1), 填充2, b(4-7) → size=8
// example2: c(0), 填充3, s(4-11), e(12-13), 尾部填充2 → size=16
// &example2.s - &example2 = 4
union A { int a[5]; char b; double c; }; // 最大成員 double=8,但 int[5]=20
// 預設 pack=4 → double 對齊 4 → union 對齊 4
// 大小 = max(20, 1, 8) = 20 → 向上取整至 4 倍數 = 20? 實測 24 (編譯器常按最大成員對齊要求對齊整體)
// 實際:double 需 8 字節對齊 → union 對齊 8 → 大小 = 24 (20→24)
struct B { int n; union A u; char c[10]; };
// n(4), 填充4, u(24), c(10), 尾部填充6 → 總 48 (按 u 對齊 8)