struct記憶體對齊問題
1:資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員存儲的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始存儲。
2:結構體作為成員:如果一個結構裡有某些結構體成員,則結構體成員要從其内部最大元素大小的整數倍位址開始存儲.(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始存儲.)
3:結構體總大小:也就是sizeof的結果,.必須是其内部最大成員的整數倍.不足的要補齊.
例1.
typedef struct AA{
int aa1; //[]....[]
double aa2; //[].....[]
float aa3; //[]..[] 原則:結構體總大小,總長要為8的整數倍,補齊[]...[]
};
typedef struct BB
{
char bb1[]; //[],[]
int bb2; //[]...[]
double bb3; //[]....[]
short bb4; //[],[]
AA a; //[]......[] 原則,内部對象為結構體
};
結果
24 48
union記憶體位元組對齊
其實union(共用體)的各個成員是以同一個位址開始存放的,每一個時刻隻可以存儲一個成員,這樣就要求它在配置設定記憶體單元時候要滿足兩點:
1.一般而言,共用體類型實際占用存儲空間為其最長的成員所占的存儲空間;
2.若是該最長的存儲空間對其他成員的元類型(如果是數組,取其類型的資料長度,例int a[5]為4)不滿足整除關系,該最大空間自動延伸;
我們來看看這段代碼:
union mm{
char a; //元長 度1
int b[];//元長度4
double c;//元長度8
int d[];
};
本來mm的空間應該是sizeof(int)*5=20;但是如果隻是20個單元的話,那可以存幾個double型(8位)呢?兩個半?當然不可以,是以mm的空間延伸為既要大于20,又要滿足其他成員所需空間的整數倍,即24
是以union的存儲空間先看它的成員中哪個占的空間最大,拿他與其他成員的元長度比較,如果可以整除