結構體對齊

2021-05-23 16:13:23 字數 820 閱讀 2204

結構體對齊問題

以下結論均在gnu gcc上驗證

概念:

偏移量——成員位址相對結構體位址的偏移

對齊原則:

1. 結構體中某成員的偏移量必須是該成員型別大小的整數倍

>>b 的偏移量必須是 short 大小的整數倍, 故在 a 後面填充乙個位元組;

>>c 的 型別大小是double, 在ansi c中, c 的偏移量是8的倍數(未驗證), 在gnu中,大於4的型別按照4來處理,故c開始的偏移  量為4,在b後面無須填充。

>>sizeof(st1)= 12; (注: 在x86 32上 gcc 編譯的結果 在64位機器上編譯成64位程式,結果是16,。 以下結果都是在x86 32 平台上編譯)

2.結構體大小必須是最大成員基本型別(如3中情況,則將成員結構體中基本型別的大小考慮進去)的整數倍

>>sizeof(st2) = 12;

3.結構體中含有結構體,則成員結構體的偏移為該結構體中最大型別大小的整數倍(gnu中大於4的按照4來處理,pragma pack() 預編譯指令有關,,未驗證)

>>sizeof(stu) = 20;

4.關於結構體位填充字段:位段型別只能是int ,char ,unsigned int 三種;位填充成員偏移量不受1的限制,即之前無須填充,資料緊跟在上一成員之後; '型別名:0'表示該型別大小(大於4位元組按4位元組(gnu))對齊;結構體大小滿足2中描述,即位段型別的整數倍。

>>sizeof(st4) = 8;

結構體對齊

現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯誤的。pragma pack規定的對齊長度,實...

結構體對齊

結構體對齊方式 1.pragma pack x 32系統預設值4,結構體元素最大長度,取三者最小值,作為每個元素對齊計算的值的倍數,並且總和是最小值的倍數!假的 於2015 12 26 修改 1.資料成員對齊原則 結構或聯合的資料成員,第乙個資料成員放在offset為0的地方,以後每個成員按照 pr...

結構體對齊

c 資料對齊 為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 這個呢?struct test1 在公布答案之...