結構體對齊規則

結構體對齊規則:

(1)第一個成員在與結構體變量偏移量爲0處

(2)其他成員變量需要對齊到某個數字(對齊數)的整數倍的地址處

對齊數=編譯器默認的一個對齊數與該成員大小的較小值

VS中默認爲8

(3)結構體總大小爲最大對齊數(每個成員變量除了第一個成員都有一個對齊數)的整數倍

(4)如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍

#include <stdio.h>
#include <stddef.h>
struct A
{
	double a;
	char c;
	char d;
};
struct B
{
	char c;
	int a;
	char d;
};
//在D中聲明一個A的成員
struct D
{
	int i;
	double d;
	char c;
	struct A a;
};
//在AA中嵌套一個BB
struct AA
{
	int a;
	double d;
	struct BB
	{
		int bb;
		double dd;
	};
	char c;
};

struct DD
{
	int a;
	double d;
	int bb;
	double dd;
	char c;
};

int main()
{
	struct  A sa;
	printf("%p\n", &(sa.a));
	printf("%p\n", &sa);
	printf("sizeof(A) = %d\n", sizeof(struct A));
	printf("sizeof(B) = %d\n", sizeof(struct B));
	printf("sizeof(D) = %d\n", sizeof(struct D));
	printf("sizeof(AA) = %d\n", sizeof(struct AA));
	printf("sizeof(DD) = %d\n", sizeof(struct DD));
	printf("i:%d\n", offsetof(struct D, i));
	printf("d:%d\n", offsetof(struct D, d));
	printf("c:%d\n", offsetof(struct D, c));
	printf("a:%d\n", offsetof(struct D, a));
	return 0;
}


*offsetof函數作用是 從其父結構體的開頭檢索成員的偏移量



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