讓我們看看下面兩個**:
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 每乙個元素放置到記憶體中時,它都會認為記...