結構體字節對齊

原文鏈接:https://blog.csdn.net/xiaoxiangyuhai/article/details/79192781

原則1:數據成員的對齊規則(以最大的類型字節爲單位)。

結構體(struct)的數據成員,第一個數據成員放在offset爲0的地方,以後每個數據成員存放在offset爲該數據成員大小的整數倍的地方(比如int在32位機爲4字節,則要從4的整數倍地址開始存儲)

原則2:結構體作爲成員的對齊規則。

如果一個結構體B裏嵌套另一個結構體A,則結構體A應從offset爲A內部最大成員的整數倍的地方開始存儲。(struct B裏存有struct A,A裏有char,int,double等成員,那A應該從8的整數倍開始存儲。),結構體A中的成員的對齊規則仍滿足原則1、原則2。

原則3:收尾工作

結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。

總結:結構體中成員的首地址必須是該成員類型所佔內存的整數倍,並且結構體總的字節數必須是最大成員所佔字節數的整數倍。

struct A
{
	char c;//0
	int i;//4-7
	short a;//8-9
	//0-9總共10字節,必須是結構體內部最大成員(int)的整數倍,所以這裏取12
	//sizeof(A) = 12
};
struct A
{
	char c;//0
	short a;//2-3
	int i;//4-7
	//0-7總共8字節,必須是結構體內部最大成員(int)的整數倍,所以這裏取8
	//sizeof(A) = 8
};
struct A
{
	char c;//0
	short a;//2-3
	double i;//8-15
	char b;//16
	//0-16總共17字節,必須是結構體內部最大成員(double)的整數倍,所以這裏取24
	//sizeof(A) = 24
};
struct A
{
	char c;//0
	short a;//2-3
	double i;//8-15
	//0-15總共16字節,必須是結構體內部最大成員(int)的整數倍,所以這裏取16
	//sizeof(A) = 16
};

struct B
{
	int a;//0-3
	char b[3];//4-6
	int c;//8-11

	A aa;//A結構體中最大的成員是double,所以從8的整數倍開始存儲,即16
		/*A結構體中的元素
		char c;//16
		short a;//17-18
		double i;//24-31
		*/
	//0-31總共32字節,必須是結構體內部最大成員(double)的整數倍,所以這裏取32
	//sizeof(B) = 32
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章