結構體的對齊

2022-05-22 14:27:06 字數 1793 閱讀 4860

個人理解,如有誤,請指正。

一 結構體內成員的的對齊

成員的位址要按照成員的大小來對齊 比如int 型別的資料的位址要按照sizeof(int)對齊

比如 typedef struct _s

s; sizeof(s) = 8

除了要考慮結構體內成員的位址對齊 還要考慮結構體自身的對齊,原因就是因為當多個結構體成員存在的時候(結構體陣列),

如果結構體自身不對齊 會造成陣列裡的其他結構體內的成員變數位址無法對齊。

二 結構體自身的對齊

1.如果沒有明確寫上paragma pack(x)結構體自身就按照結構體裡最大成員長度對齊

比如 typedef struct _file_basic_information

file_basic_information;

sizeof(file_basic_information) = 40

整個結構體按sizeof(large_integer)對齊

2.如果明確寫上paragma pack(x)則又分為兩種情況:

a.如果x小於結構體長度最大的成員的長度 則按x對齊

比如 pragma pack(4)

typedef struct _file_basic_information

file_basic_information;

sizeof(file_basic_information) = 36(按4對齊而不是按sizeof(large_integer)

b.如果x大於結構體長度最大的成員的長度 則按結構體裡長度最長成員長度對齊

比如 pragma pack(8)

typedef struct _x

x; sizeof(x) = 4 (按sizeof(short)對齊)

個人理解,如有誤,請指正。

一 結構體內成員的的對齊

成員的位址要按照成員的大小來對齊 比如int 型別的資料的位址要按照sizeof(int)對齊

比如 typedef struct _s

s; sizeof(s) = 8

除了要考慮結構體內成員的位址對齊 還要考慮結構體自身的對齊,原因就是因為當多個結構體成員存在的時候(結構體陣列),

如果結構體自身不對齊 會造成陣列裡的其他結構體內的成員變數位址無法對齊。

二 結構體自身的對齊

1.如果沒有明確寫上paragma pack(x)結構體自身就按照結構體裡最大成員長度對齊

比如 typedef struct _file_basic_information

file_basic_information;

sizeof(file_basic_information) = 40

整個結構體按sizeof(large_integer)對齊

2.如果明確寫上paragma pack(x)則又分為兩種情況:

a.如果x小於結構體長度最大的成員的長度 則按x對齊

比如 pragma pack(4)

typedef struct _file_basic_information

file_basic_information;

sizeof(file_basic_information) = 36(按4對齊而不是按sizeof(large_integer)

b.如果x大於結構體長度最大的成員的長度 則按結構體裡長度最長成員長度對齊

比如 pragma pack(8)

typedef struct _x

x; sizeof(x) = 4 (按sizeof(short)對齊)

結構體對齊

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

結構體對齊

結構體對齊問題 以下結論均在gnu gcc上驗證 概念 偏移量 成員位址相對結構體位址的偏移 對齊原則 1.結構體中某成員的偏移量必須是該成員型別大小的整數倍 b 的偏移量必須是 short 大小的整數倍,故在 a 後面填充乙個位元組 c 的 型別大小是double,在ansi c中,c 的偏移量是...

結構體對齊

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