c c 裡struct位元組對齊規則

2022-05-18 04:36:33 字數 1032 閱讀 1493

#pragma pack(n)

編譯器用'n'來設定資料的對齊方式。預設32位os對齊位元組是4,64位對齊位元組是8。'n'有可能影響結構體內部成員的對齊位置,以及結構體整體大小。

對齊規則

規則一.: 

每個成員變數在其結構體內的偏移量都是「min(對齊位元組,成員變數型別的大小)」的倍數。

規則二: 

如果有巢狀結構體,那麼內嵌結構體的第乙個成員變數在外結構體中的偏移量,是「min(對齊位元組,內嵌結構體中那個資料型別大小最大的成員變數)」的倍數。

規則三: 整個結構體的大小要是「min(對齊位元組,這個結構體內資料型別大小最大的成員變數)」的倍數。如果有內嵌結構體,那麼取「min(對齊位元組,內嵌結構體中資料型別大小最大的成員變數)」作為計算外結構體整體大小的依據。

環境:64位os

圖一如上圖所示,根據規則一,nd在結構體內的位置必須滿足是其自身資料型別大小的整數倍,且倍數要取滿足條件的最小倍數。因為nd前三個成員變數總大小是6bytes,nd作為int型別,其資料型別大小是4bytes,滿足條件的最小倍數是2,所以nd在結構體中的偏移量是8,故填充2bytes。

根據規則二,ng作為內嵌結構體的第乙個成員變數,它在外結構體中的偏移量要滿足——其內嵌結構體中最大資料型別大小的倍數。在計算cf偏移量後,當前偏移量是13,而內嵌結構體中最大資料型別為long long,其大小為8,ng的偏移量必須是8的倍數,且取大於13的最小倍數,即2。所以ng前要填充3bytes。

根據規則三,計算完ci後,當前偏移量是33。如果要滿足test結構體的大小是其中最大資料成員型別大小的倍數,在此例中是內嵌結構體的成員變數llh,即8的倍數。所以要填充7bytes。

csdn部落格:

位元組對齊與結構體:

struct 位元組對齊

轉貼 1.資料型別自身的對齊值 就是上面交代的基本資料型別的自身對齊值。2.指定對齊值 progma pack value 時的指定對齊值value。3.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。4.資料成員 結構體和類的有效對齊值 自身對齊值和指定對齊值中小的那個值。有了這些值,我...

struct 記憶體對齊規則

1 確定資料成員的offset位址 a 基本資料型別 不包括陣列 struct class uinon 起始offset位址,規律如下,sizeof atom type n n 0,1,2,3.例子 char 0,1,2,3.int 0,4,8,12.double 0,8,16,24.b 組合資料成...

位元組對齊規則

四個重要的基本概念。1.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,其自身對齊值為4,double為8單位位元組。2.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。3.指定對齊值 pragma pack value 時的指定對...