基本型別變數在記憶體中的起始位址必須是其大小的整數倍(address % size == 0)。結構體/類別的對齊值取其成員中最大基本型別大小。這是為了配合 CPU 存取特定位址的硬體需求,提升讀取效率(避免跨邊界讀取需兩次週期)。
| 概念 | 定義 |
|---|---|
| 資料型別自身對齊值 | sizeof(type),如 char=1, short=2, int/long/float/double=4(32位系統) |
| 結構體/類別自身對齊值 | 所有成員基本型別中最大的自身對齊值(遞迴展開嵌套結構) |
| 指定對齊值 | #pragma pack(n) 指定的值,預設為編譯器預設值(通常 4/8) |
| 有效對齊值 | min(自身對齊值, 指定對齊值) —— 最終決定存放位址的關鍵值 |
#pragma pack(n) > 自身對齊值,指定值無效,以自身對齊值為準。#pragma pack(4)
struct TestA {
int a; // offset 0, size 4
char b; // offset 4, size 1
short c; // offset 6 (2的倍數), size 2
char d; // offset 8, size 1
}; // 有效大小 9,結構體對齊值=min(4,4)=4 → 總大小 12 (4的倍數)
#pragma pack(2)
struct TestA { ... }; // 總大小 10 (2的倍數)
#pragma pack(2)
struct A { char c; int i; }; // 有效大小 6,自身對齊值=4,有效對齊值=min(4,2)=2 → sizeof(A)=6
struct B { char c1; A s; char c2; }; // 有效大小 9,最寬成員為 A(6),有效對齊值=min(6,2)=2 → sizeof(B)=10
__attribute__((aligned(n))):強制對齊到 n 位元組邊界,若成員更大則以成員為準(與 pack 邏輯相反)。__attribute__((packed)):取消優化對齊,按實際大小緊湊排列,等價 #pragma pack(1)。#pragma pack(push, n) / #pragma pack(pop) 保護作用域,避免汙染全域。