一般的實現上結構體佈局是這樣(暫不計位域和柔性陣列):
首個成員偏移是 0 (標準要求)。
後一個成員需要在前一個成員之後(標準要求)。其偏移是保證該成員不與前一成員重疊的該成員對齊的最小整數倍。
結構體的對齊是各個成員對齊的最大值。結構體的大小是能保證放下最後成員的對齊的最小整數倍。
標準允許結構體有更大對齊或佈局更加“鬆垮”一點(有更多空隙),但實現一般不會這樣。
一般實現上陣列型別的對齊同元素型別。
這裡的規則無論成員和元素是否為結構體都成立。
按題主描述,測試所用的平臺使用 LP64 資料模型,short 大小與對齊均為 2 位元組, int 大小與對齊均為 4 位元組, long 及指標大小與對齊均為 8 位元組。
struct P1 { int a; char b; int c; char d; };
a 偏移為 0 , b 偏移為 4 , c 偏移為 8 (大於 4 + 1 的 4 的最小整數倍), d 偏移為 12 。 P1 對齊為 4 ,大小為 16 。
struct P2 { int a; char b; char c; long d; };
a 偏移為 0 , b 偏移為 4 , c 偏移為 5 , d 偏移為 8 。 P2 對齊為 8 , 大小為 16 。
struct P3 { short a[3]; char b[3]; };
a 偏移為 0 , b 偏移為 6 。 P3 對齊為 2 ,大小為 10 。
struct P4 { short a[3]; char *b[3]; };
a 偏移為 0 , b 偏移為 8 (大於 0 + 6 的 8 的最小整數倍)。 P4 對齊為 8 ,大小為 32 。
struct P5 { struct P3 a[2];struct P2 t;};
a 偏移為 0 , t 偏移為 24 (大於 0 + 20 的 8 的最小整數倍)。 P5 對齊為 8 ,大小為 40 。
C 中型別大小可用 sizeof 獲取,型別對齊可用 _Alignof 獲取,成員偏移可用宏 offsetof 獲取。
一般的實現上結構體佈局是這樣(暫不計位域和柔性陣列):
首個成員偏移是 0 (標準要求)。
後一個成員需要在前一個成員之後(標準要求)。其偏移是保證該成員不與前一成員重疊的該成員對齊的最小整數倍。
結構體的對齊是各個成員對齊的最大值。結構體的大小是能保證放下最後成員的對齊的最小整數倍。
標準允許結構體有更大對齊或佈局更加“鬆垮”一點(有更多空隙),但實現一般不會這樣。
一般實現上陣列型別的對齊同元素型別。
這裡的規則無論成員和元素是否為結構體都成立。
按題主描述,測試所用的平臺使用 LP64 資料模型,short 大小與對齊均為 2 位元組, int 大小與對齊均為 4 位元組, long 及指標大小與對齊均為 8 位元組。
struct P1 { int a; char b; int c; char d; };
a 偏移為 0 , b 偏移為 4 , c 偏移為 8 (大於 4 + 1 的 4 的最小整數倍), d 偏移為 12 。 P1 對齊為 4 ,大小為 16 。
struct P2 { int a; char b; char c; long d; };
a 偏移為 0 , b 偏移為 4 , c 偏移為 5 , d 偏移為 8 。 P2 對齊為 8 , 大小為 16 。
struct P3 { short a[3]; char b[3]; };
a 偏移為 0 , b 偏移為 6 。 P3 對齊為 2 ,大小為 10 。
struct P4 { short a[3]; char *b[3]; };
a 偏移為 0 , b 偏移為 8 (大於 0 + 6 的 8 的最小整數倍)。 P4 對齊為 8 ,大小為 32 。
struct P5 { struct P3 a[2];struct P2 t;};
a 偏移為 0 , t 偏移為 24 (大於 0 + 20 的 8 的最小整數倍)。 P5 對齊為 8 ,大小為 40 。
C 中型別大小可用 sizeof 獲取,型別對齊可用 _Alignof 獲取,成員偏移可用宏 offsetof 獲取。