網上常見觀點認為嵌套結構體應作為整體按其大小對齊,但實測(GCC、VS2010)證明該觀點錯誤。本文通過多組實例給出正確規則。
struct s1 { char c[4]; }; // sizeof = 4
struct s2 { char a; struct s1 s; } // sizeof = 5 (非 8)
內存佈局:s2: a | s.c[0] s.c[1] s.c[2] s.c[3]
s 起始地址只需滿足 char 對齊(1 字節),而非 4 字節。
struct S1 { char c; short s; }; // sizeof = 4 (對齊後)
struct S2 { char a; struct S1 s; } // sizeof = 6
S2 佈局:a | padding(1) | s.c | s.s
s 起始地址按其內部最寬類型 short (2 字節) 對齊,整體大小也按 2 字節對齊。
struct S { char c; char d; short s; } // sizeof = 4
手動展開後編譯器可優化填充,嵌套時保持內部佈局不變,導致外層可能增加填充。
CPU 讀取內存以字長(32 位為 4 字節)為單位。對齊旨在減少訪存次數。基本類型長度可控,強制整體對齊收益大;嵌套結構體長度不定,若強制整體對齊可能浪費大量空間且不減少訪存次數。故編譯器退而求其次,按內部最長類型對齊,平衡時空。