1、 對于結構的各個成員,第一個成員位于偏移為0的位置,以后每個資料成員的偏移量必須是min(#pragma pack()指定的數,這個資料成員的自身長度) 的倍數,
2、 在資料成員完成各自對齊之后,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行,
如:
struct ex{
char a;
double c;
int b;
};
char占一個位元組,起始偏移為0 ,double 占8個位元組,min(#pragma pack()指定的數,這個資料成員的自身長度) = 8(VC6默認8位元組對齊),所以double按8位元組對齊,起始偏移必須為8的倍數,所以起始偏移為8,在char后編譯器會添加7個位元組的額外位元組,不存放任意資料,int占4個位元組,按4位元組對齊,起始偏移為16,正好是4的倍數,無須添加額外位元組,到此規則1的資料成員對齊結束,此時的記憶體狀態為:
oxxxxxxx|oooooooo|oooo
共占16個位元組,還要繼續進行結構本身的對齊,(規則2)對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行對齊,ex結構中最大資料成員長度為double,占8位元組,而默認的#pragma pack 指定的值為8,所以結果本身按照8位元組對齊,結構總大小必須為8的倍數,16既滿足,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/549755.html
標籤:其他
上一篇:巧用Nginx配置解決跨域問題
下一篇:光柵化演算法-中點畫圓演算法
