struct A { int a; char b; int c; }; // sizeof = 12
struct B { char b; int a; int c; }; // sizeof = 12
struct C { int a; char b; short c; long long d; int e; }; // sizeof = 24
int a; char b; int c;偏移 0-3 : a (int, 4字節) 偏移 4 : b (char, 1字節) 偏移 5-7 : 【填充 3 字節】← 使 c 對齊到 4 的倍數 偏移 8-11 : c (int, 4字節) 總大小 12 :已是 4 的倍數,無尾部填充
char b; int a; int c;偏移 0 : b (char, 1字節) 偏移 1-3 : 【填充 3 字節】← 使 a 對齊 偏移 4-7 : a (int) 偏移 8-11 : c (int) 總大小 12
雖然成員順序不同,但受最寬類型 (int=4) 制約,最終大小相同。成員重排可減少填充(如將 char 移到末尾)。
成員序列:int(4) | char(1) | short(2) | long long(8) | int(4) 最寬類型:long long (8字節) → 結構體大小須 8 的倍數 偏移計算: 0-3 : int a (4) 4 : char b (1) 5 : 【填充 1】→ short c 對齊到 2 的倍數 (偏移 6) 6-7 : short c (2) 8-15 : long long d (8) ← 已自然對齊到 8 的倍數 16-19 : int e (4) 20-23 : 【尾部填充 4】→ 總大小 24 (8的倍數)
作者原文表格中「偏移 5 填充 1」後接 short (偏移 6),再接 long long (偏移 8) 完全吻合。最終 24 字節符合規則。
offsetof 宏與手動控制#include <stddef.h>
printf("offset of c = %zu\n", offsetof(struct A, c)); // 標準庫獲取偏移
#pragma pack(n) / __attribute__((packed)):壓縮結構體(犧牲訪問速度換空間)。packed + 手動填充保證跨平台一致性。