结构体内存对齐:如何计算结构体变量的大小

结构体内存对齐:如何计算结构体变量的大小

一、 掌握结构体的对齐规则

1、第一个成员在与结构体变量偏移量为0的地址处。
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数=编译器默认的一个对齐数与该成员的大小进行比较得出的较小值
vs(博主使用的编译器)中默认为8 gcc当中没有默认对齐数,此时对齐数为成员变量大小。
3、结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

二、例子分析

代码显示:

struct S1
{
	char c1;//第一个成员变量,在与s1变量偏移量为0的地址处
	int a;//int 类型内存大小为4,与8相比,4位第二个成员变量的对齐数,在与s1变量偏移量为4的整数倍的地址处
	char c2;//第三个成员变量,char类型 内存大小为1,与8相比,对齐数为1,在与s1偏移量为1的整数倍的地址处
	//最后结构体的总大小为最大对齐数即(1,4,1)中最大数4的整数倍
};
struct S2
{
	char c1;
	char c2;
	int a;
};
int main()
{
	struct S1 s1 = { 0 };
	printf("%d\n", sizeof(s1));//计算结构体变量s1的内存大小
	struct S2 s2 = { 0 };
	printf("%d\n", sizeof(s2));//计算结构体变量s2的内存大小
	return 0;
}

结果:
在这里插入图片描述
(1)s1的计算过程:

在这里插入图片描述
如图,变量s1在内存中开辟一个空间,c1是第一个成员变量,在与结构体变量为0的地址处(红色区域为c1所占内存空间)。a为s1的第二个成员变量(int 类型),它的大小为4字节,对齐数为4(与8比较),位于与s1偏移量为4(4的整数倍)的地址处(紫色区域),c1与a之间的空白为浪费的空间。c2的对齐数为1,它在与s1偏移量为9(1的整数倍)的地址处(粉色区域),因为现在的结构体大小为9,而结构体的总大小要为最大对齐数(4)的整数倍,所以我们还要浪费三个字节的空间,因此此时s1的总大小为12字节。
(2)s2的计算过程:
在这里插入图片描述
如图,变量s2在内存中开辟一个空间,c1是第一个成员变量,在与结构体变量为0的地址处(红色区域为c1所占内存空间)。c2为s1的第二个成员变量(char类型),它的大小为1个字节,对齐数为1(与8比较),位于与s1偏移量为1(1的整数倍)的地址处(绿色区域)。a的对齐数为4(与8比较),它在与s1偏移量为4(4的整数倍)的地址处(紫色区域),c2与a之间的空白为浪费的空间,因为现在的结构体大小为8,是最大对齐数(4)的整数倍,所以此时s2的总大小就为8。

嵌套结构体变量

代码显示:

struct S3
{
	double d;//8
	char c;//1
	int i;//4
};

struct S4
{
	char c1;//1
	struct S3 s3;//对齐数为S3中各对齐数的最大对齐数即max(8,1,4)
	double d;//8
};




int main()
{
	struct S3 s3 = { 0 };
	printf("%d\n", sizeof(s3));//计算结构体变量s3的内存大小
	struct S4 s4= { 0 };
	printf("%d\n", sizeof(s4));//计算嵌套结构体变量s4的内存大小
	return 0;
}

结果:
在这里插入图片描述
(3)s3的计算过程:
在这里插入图片描述
如图,变量s3在内存中开辟一个空间,d是第一个成员变量,在与结构体变量为0的地址处(红色区域为d所占内存空间)。c为s3的第二个成员变量(char类型),它的大小为1个字节,对齐数为1(与8比较),位于与s3偏移量为8(1的整数倍)的地址处(绿色区域)。i的对齐数为4(与8比较),它在与s3偏移量为12(4的整数倍)的地址处(蓝色区域),紫色区域为浪费的空间,因为现在的结构体大小为16,是最大对齐数(8)的整数倍,所以此时s3的总大小就为16。

(4)嵌套结构体变量s4的计算:
在这里插入图片描述
如图,变量s4在内存中开辟一个空间,c1是第一个成员变量,在与结构体变量为0的地址处(蓝色区域为c1所占内存空间)。s3为s4的第二个成员变量(结构体 类型),s3的对齐数为s3中所有对齐数中最大的对齐数(即max(8,1,4))8,位于与s4偏移量为8(8的整数倍)的地址处(绿色区域)。红色区域为浪费的空间。d的对齐数为4(与8比较),它在与s4偏移量为24(4的整数倍)的地址处(紫色区域),因为现在的结构体大小为32,是最大对齐数(8)的整数倍,所以此时s4的总大小就为32。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值