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