int、signed int、unsigned int(C99 允許 _Bool)。int 通常 32 位)。| 結構體定義 | 位域分佈 | sizeof | 解析 |
|---|---|---|---|
struct { char c:4; int l:30; } | 4+30=34bit > 32bit | 8 | 跨 int 邊界,佔兩個 int 槽(8B),按 4B 對齊 |
struct { char c:4; int l:20; } | 24bit ≤ 32bit | 4 | 同一 int 槽,按 int 對齊 4B |
struct { char c:4; short l:10; } | 14bit ≤ 16bit | 2 | 同一 short 槽,按 short 對齊 2B |
struct { char c:4; short l:13; } | 17bit > 16bit | 4 | 跨 short 邊界,佔兩個 short(4B),按 int 對齊 4B |
// 原始:20 bytes
struct BitArea {
int a:1;
char b:1;
int c;
char d:3;
char e:5;
int f;
char g:3;
};
// 優化 1:同類型位域聚合 → 16 bytes
struct BitAreaBetter {
char b:1; char d:3; char e:5; char g:3; // 12bit → 1 個 int 槽
int c; int f; int a:1; // 3 個 int 槽
};
// 優化 2:位域盡量合併入現有類型槽 → 12 bytes
struct BitAreaBest {
char b:1; char d:3; char e:5; char g:3; int a:1; // 總 13bit ≤ 32bit → 1 個 int 槽
int c; int f; // 2 個 int 槽
};
// 優化 3:順序調整但未合併 → 16 bytes
struct BitAreaBest1 {
int a:1; int c; int f;
char b:1; char d:3; char e:5; char g:3;
};
BitArea1 len is 20 BITAREABETTER len is 16 BitAreaBest len is 12 len01 is 8 BitAreaBest01 len is 16
int :0;)強制對齊,除非有意填充。位域優化本質是引導編譯器存儲單元分配。理解「存儲單元 = 類型大小」「跨類型不共享單元」「整體按最寬成員對齊」三大規則,通過字段重排序即可將結構體體積壓縮 30%~50%。嵌入式、高性能網絡協議解析、大規模數據結構場景收益顯著。本文整理自 CSDN 博客「yygydjkthh」結構體系列。