图解如何计算结构体大小

首先来看这样一个例子:

struct X {
    char a;			// 1 bytes
	char padding1[3];	// 3 bytes
	float b;		// 4 bytes
	int c;			// 4 bytes
	char padding2[4];	// 4 bytes
	double d;		// 8 bytes
	unsigned e;		// 4 bytes
	char padding3[4];	// 4 bytes
};

要求计算上述结构体的大小,之前接触过的同学,可能有点茫然,是不是按照每个元素的空间相加得到呢?其实不然,虽然上述的代码在计算输出之后和相加得到的值相等,来看菜鸟教程的一段话:

结构体计算要遵循字节对齐原则。
结构体默认的字节对齐一般满足三个准则:
1、结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2、结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal
adding);
3、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing
padding)

这里个人认为只需要牢牢记住结构体的总大小为结构体最宽基本类型成员大小的整数倍这句话即可,然后遵循搭积木原则,如何实现呢,就以上述代码为例:
在这里插入图片描述
首先找到最宽类型的成员double d,占了8 bytes,然后下一行放入char a,占了1 bytes,如果还没有记住这些基本常量的同学赶紧去背一下,以后所有成员的累加长度不得超过该限制,接下来放入char padding1[3]float b
在这里插入图片描述
这两个共占了7 bytes,所以说下一位成员要从下一行开始:
在这里插入图片描述
最后加入后买那个两位成员:

在这里插入图片描述
最后结果是 8bytes * 4(行) = 32bytes
这个例子是很完美的,没有出现行内空缺的情况,但是如果变化一下结果该结构体的成员位置,结果也会随之改变:

struct X {
	char padding1[3];	// 3 bytes
	float b;		// 4 bytes
	int c;			// 4 bytes
	char padding2[4];	// 4 bytes
	double d;		// 8 bytes
	unsigned e;		// 4 bytes
	char padding3[4];	// 4 bytes
	char a;			// 1 bytes
};
cout << sizeof(X)<< endl; //40

模型图如下所示:
在这里插入图片描述
可以得出原因:
由于第二行,int c的大小加上第二行已有的数据,则会大于8 bytes,所以只能放到下一行,这样就会比之前的结构体多出一行,使得:
最后结果是 8bytes * 5(行) = 40bytes

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值