sizeof(struct) 的結果往往不等於成員大小之和,原因在於**內存對齊**。本文通過三個具體例子,圖解結構體在內存中的佈局規則,並總結影響大小的關鍵因素。
struct A { char a; int b; short c; };
內存佈局(每格 1 字節,共 3 個單元,每單元 4 字節):
單元0: a | 填充 | 填充 | 填充 ← a 偏移 0,int 需 4 字節對齊,故 a 後填 3 字節 單元1: b | b | b | b ← int 佔 4 字節 單元2: c | c | 填充 | 填充 ← short 佔 2 字節,結構體總大小須 4 的倍數,再填 2 字節
sizeof = 12 字節
struct B { char a; short c; int b; };
單元0: a | c | c | 填充 ← a(1) + short(2) = 3,int 需 4 字節對齊,填 1 字節 單元1: b | b | b | b ← int 佔滿一單元
sizeof = 8 字節 —— **同樣成員,不同順序,節省 4 字節!**
struct C { char a; char b[2]; char c[4]; };
單元0: a | b[0] | b[1] | c[0] | c[1] | c[2] | c[3] ← 連續排列,無填充
sizeof = 7 字節 —— 無對齊壓力,最緊湊。
alignas/alignof 提供標準化對齊控制。#pragma pack(1) 或手動序列化,**不要直接二進制寫入**,避免跨平台兼容性問題;offsetof(T, member) 獲取成員偏移,配合 sizeof 驗證佈局預期。| 結構體 | 成員順序 | sizeof | 填充字節 | 空間利用率 |
|---|---|---|---|---|
| A | char, int, short | 12 | 5 | 58% |
| B | char, short, int | 8 | 1 | 87% |
| C | 全 char | 7 | 0 | 100% |
理解內存對齊,不僅能準確預測 sizeof,更能在系統級編程中設計出**緊湊、高效、可移植**的數據結構。