结构体内存对齐

文章目录

  • 结构体内存对齐

结构体内存对齐

对齐规则:
1.结构体的第一个成员,对齐到结构体在内存中存放位置的0偏移处
2.从第二个成员开始,每个成员都要对齐到(一个对齐数)的整数倍处对齐数。
对齐数:结构体成员自身大小和默认对齐数的较小值
VS:默认对齐数为8
Linux gcc:没有默认对齐数,对齐数就是结构体成员的自身大小
3.结构体的总大小,必须是所有成员的对齐数中最大对齐数的整数倍
4.如果结构体中嵌套了结构体成员,要将嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍。
结构体的总大小必须是最大对齐数的整数倍,这里的最大对齐数是:包含嵌套结构体成员中的对齐数的所有对齐数中的最大值。
举例:

#include 

struct s1 
{
	char c1;
	int  i;
	char c2;
};

struct s2 
{
	char c1;
	char c2;
	int i;
};

int main()
{
	printf("%d\n", sizeof(struct s1));
	printf("%d\n", sizeof(struct s2));
	return 0;
}

结果:
在这里插入图片描述
结果一个为12 一个为8,为什么同样的子成员,结构体所占空间大小不同?又为什么结构体所占内存大小不是各个子成员类型所占内存大小之和?
结构体内存对齐_第1张图片
结构体内存对齐_第2张图片

#include 

struct S3 
{
	double d;
	char c;
	int i;
};

struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
int main()
{
	printf("%d\n", sizeof(struct S3));
	printf("%d\n", sizeof(struct S4));
	return 0;
}

在这里插入图片描述
结构体内存对齐_第3张图片
结构体内存对齐_第4张图片
结构体内存对齐_第5张图片

你可能感兴趣的:(C,c语言)