結構體對齊

2021-10-22 18:26:47 字數 1689 閱讀 3053

1.n位元組對齊,32位預設n為4,64位預設n位8,(n是結構體內長度最大的資料型別的長度(位元組數),)

2.每個變數的對齊規則都是自己的資料型別長度大小

3.總長度是位元組對齊數的整數倍

struct s1

;typedef

struct s2

s2_tyname;

struct s3

;int

main()

#pragma pack(n)有兩種用法:

我們需要#prgama pack(n)開頭,以#pragma pack()結尾,定義乙個區間,這個區間內的對齊引數就是n。

#pragma pack(1)

struct s4

;#pragma pack()

#pragma pack(4)

struct s5

;#pragma pack()

#pragma pack(8)

struct s6

;#pragma pack()

#pragma pack(16)

struct s7

;#pragma pack()

printf

("s4 = %ld\n"

,sizeof

(struct s4));

//17

printf

("s5 = %ld\n"

,sizeof

(struct s5));

//20

printf

("s6 = %ld\n"

,sizeof

(struct s6));

//24

printf

("s7 = %ld\n"

,sizeof

(struct s7));

//24

1 :1位元組對齊

__attribute__((packed)) :下劃線是兩個
struct s8

__attribute

((packed));

sizeof

(struct s8)

==17

;即1位元組對齊

2 :n位元組對齊

__attribute__((aligned(n))):下劃線是兩個
struct s11

__attribute__((

aligned

(1024))

);printf

("s10 = %ld\n"

,sizeof

(struct s11));

//1024(1

)__attribute__

((packed)

)使用時直接放在要進行記憶體對齊的型別定義的後面,然後它起作用的範圍只有加了這個東西的這乙個型別。packed的作用就是取消對齊訪問。(2

)__attribute__((

aligned

(n))

)使用時直接放在要進行記憶體對齊的型別定義的後面,然後它起作用的範圍只有加了這個東西的這乙個型別。它的作用是讓整個結構體變數整體進行n位元組對齊(注意是結構體變數整體n位元組對齊,而不是結構體內各元素也要n位元組對齊)

結構體對齊

現在去掉第乙個成員變數為如下 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...