結構體成員在內存中並非緊密排列,而是按特定規則對齊,以便 CPU 高效訪問。對齊可能在成員間插入填充字節。
min(成員大尺寸, 默認對齊數) 的倍數。max(最大成員大小, 默認對齊數) 的倍數,不足則尾部填充。n ∈ {1,2,4,8,16}),不能調大。// 64位系統,默認對齊 8
struct A { int a; long b; }; // a:4, 填充4, b:8 => size=16
struct B { long a; int b; }; // a:8, b:4, 填充4 => size=16
#pragma pack(4)
struct C { long a; int b; }; // a:8 (min(8,4)=4 對齊? 實際 long 仍 8 字節對齊? 視編譯器)
#pragma pack()
// 巢狀結構體:內部結構體對齊數決定外部成員對齊
struct Inner { char a,b,c; }; // size=3, align=1
struct Outer { Inner x,y,z; }; // size=9, align=1
struct Inner2 { short a; char b; }; // size=4, align=2
struct Outer2 { Inner2 x,y,z; }; // size=12, align=2
alignas(C++11)可指定更嚴格對齊:alignas(16) int arr[4];。offsetof 宏可獲取成員偏移量,驗證對齊效果。掌握「成員對齊 → 整體對齊 → pack 控制」三步法,配合 sizeof/offsetof 實測,即可精準預測結構體內存佈局。網絡協議、文件格式、共享內存等場景務必顯式控制對齊。