變數位址若為其長度整數倍,即為自然對齊。32 位系統上 int (4 bytes) 位址為 4 的倍數即自然對齊。編譯器自動安排成員位址滿足對齊需求,必要時插入填充位元組。
int 需兩次讀取並拼湊)。x86 允許但降速;SPARC 等架構直接觸發硬體例外 (SIGBUS)。LOCK CMPXCHG) 要求操作數對齊。| 類型 | 大小 | 自然對齊 |
|---|---|---|
| char / bool | 1 | 1 |
| short | 2 | 2 |
| int / float | 4 | 4 |
| long / double / pointer | 4/8 | 4/8 (視平台) |
| long long | 8 | 8 |
struct A { int a; char b; short c; }; // 4 + 1 + (pad1) + 2 + (pad1) = 8
struct B { char b; int a; short c; }; // 1 + (pad3) + 4 + 2 + (pad2) = 12
優化技巧:按大小遞減排列成員可最小化填充。
#pragma pack(1) // 1 位元組對齊 (緊湊)
struct Packed { char c; int i; }; // sizeof = 5
#pragma pack() // 恢復預設
struct Aligned8 { int a; } __attribute__((aligned(8))); // 整體 8 位元組對齊
struct Packed { int a; } __attribute__((packed)); // 取消對齊優化
struct alignas(16) CacheLine { int data; }; // 強制 16 位元組對齊 (快取行)
static_assert(alignof(CacheLine) == 16);
pack(1)sizeof 回傳不含尾部填充的大小 → ✅ 含尾部填充pack(1) 總是最省記憶體 → ✅ 可能導致未對齊存取效能暴跌或硬體錯誤