【C++】计算struct结构体占用的长度

关于结构体和类所占用的长度计算方式介绍。


struct A
{
    char a[5];
    int b;
    short int c;
}structA;

在上例中,要计算 sizeof(a) 是多少?

有两个原则:

1)各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数

即当 A中的a占用了5个字节后,b需要占用四个字节,此时如果b直接放在a后,则b的起始地址是5,不是sizeof(int)的整数倍,所以

需要在a后面补充3个空字节,使得b的起始地址为8. 当放完b后,总空间为5+3+4 = 12. 接着放c,此时为 12 + 2 = 14.

2)为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,

      所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

这是说A中占用最大空间的类型,就是int型了,占用了4个字节,那么规定A占用的空间必须是4的整数倍。本来计算出来占用的空间为14,

不是4的整数倍,因此需要在最后补充2个字节。最终导致A占用的空间为16个字节。


struct B
{
    char *d;
    short int e;
    long long f;
    char c[1];
}b;

void test2() {
	printf("%d\n", sizeof(b));
}

对于此题,需要注意的一点是:windows系统对long long是按照8字节进行对齐的,但是Linux系统对long long则是按照4字节对齐的。

因此:

d占用4字节

e占用2字节

f占用8字节,但是其起始地址为为0, 不是4的整数倍(对于Linux系统),或不是8的整数倍(对于Windows系统),因此对e之后进行字节补齐,

在这里不管对于Linux还是Windows都是补充2个字节,因此 f 的起始地址是8,占用8个字节。

对于c,它占用了1个字节,起始地址是16,也是1的整数倍。 

最后,在c之后需要对整个B结构体占用的空间进行补齐,目前占用空间是16+1 = 17个字节。

对于Linux,按4字节补齐(long long 是按4字节补齐的),因此补充了3位空字节,最后占用空间是 17 + 3 = 20字节。

对于Windows系统,是按8字节补齐的,因此就补充了7个字节,最后占用的空间是24字节。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值