結構體對齊規則及位域規則

2021-09-20 04:16:11 字數 1620 閱讀 6607

讓我們看看下面兩個**:

struct s1

;struct s2

;int

main()

;printf

("%d\n"

,sizeof

(struct s1));

printf

("%d\n"

,sizeof

(s1));

printf

("%d\n"

,sizeof

(struct s2));

system

("pause");

return0;

}

得出的結果會不會是一樣的呢?

讓我們看下結果:

答案是否定的。

造成這樣的原因是:結構體對齊對齊規則如下圖:共佔12個位元組

關於3 和 4規則 的運用:

struct s3

;//16

struct s4

;//總計32

printf

("%d\n"

,sizeof

(struct s3));

printf

("%d\n"

,sizeof

(struct s4));

printf

("%d\n"

,offsetof

(struct s4, c1));

printf

("%d\n"

,offsetof

(struct s4, s3));

printf

("%d\n"

,offsetof

(struct s4, d)

);

結果

1.平台原理(移植問題):不是所有硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲異常

2.效能問題:資料結構應該盡可能的在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要兩次記憶體訪問,而對齊的只需要一次。

位域 :必須有「int」、「signed int」或「unsigned int」型別但是很多編譯器都對型別有拓展。

規則:-1.如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof的大小,則後面的字元將緊鄰前乙個字段儲存,直到不能容納為止。

結構體對齊規則

結構體對齊 pragma pack 4 結構體的長度 sizeof 乙個沒有考慮周詳的位段結構體中,可能存在大量 縫隙 1.實際對齊值決定系統一次劃分記憶體的位元組數量。系統為變數分配記憶體時,必須先劃分夠變數資料型別需要的對齊空間 對齊模數,位元組單位 2.結構體的實際對齊值為結構體中最大的資料型...

結構體對齊規則

結構體對齊規則 1 第乙個成員在與結構體變數偏移量為0處 2 其他成員變數需要對齊到某個數字 對齊數 的整數倍的位址處 對齊數 編譯器預設的乙個對齊數與該成員大小的較小值 vs中預設為8 3 結構體總大小為最大對齊數 每個成員變數除了第乙個成員都有乙個對齊數 的整數倍 4 如果巢狀了結構體的情況,巢...

結構體對齊規則

結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 每乙個元素放置到記憶體中時,它都會認為記...