关于结构体的变量内存大小问题

今天做到一道题目,题目是这样的:
Alt
这里考察了两个知识点:

uinon结构体内存大小

union变量所占的大小为成员中最大的那一个

关于struct结构体的对齐问题

参考了这篇博客struct结构体对齐问题
我们知道,struct结构体中可以有不同的数据类型变量,成员定义时依次存储在内存连续的空间,struct结构体变量的首地址就是第一个成员的地址,那么内存偏移量就是各个成员相对于结构体变量地址的差(即相对于第一个成员地址的差)对于某个成员的内存偏移量,就为上一个成员的内存偏移量+上一个内存成员的大小

那么另外我们需要了解的是对齐参数,系统默认的对齐参数由pack决定,每个成员的对齐参数为min(pack,成员类型大小),那么求出每个成员各自的对齐参数之后,那么结构体的对齐参数就为各个成员函数的对齐参数的最大值(也就是说,一个结构体的对齐参数最大也就为8),对齐参数的作用就是:对于每个成员的偏移量,需要能够被该成员的对齐参数整除,否则需要把该偏移量补齐到离他最近的对齐参数的倍数(对于偏移量为0,那么也是补齐为0)

那么我们如何计算出一个结构体的实际大小呢,(1)从第一个成员出发,计算出该成员的内存偏移量(2)按照对齐参数来计算该成员的实际内存偏移量(3)依次按照上面的步骤计算出各个成员的实际内存偏移量(4)结构体的大小就为最后一个成员的大小+实际内存偏移量(5)结构体的实际大小就为按照对齐参数补齐得出的大小
拿我们上面这个例子来说:

(1)id的偏移量为0,按照它的对齐参数min(1,8)=0来补齐,所得的实际偏移量也是0
(2)crc的偏移量0+1=1,按照它的对齐参数min(4,8)=4来补齐,那么它的实际偏移量就为4
(3)pack的偏移量为1+4=5,按照它的对齐参数min(4,8)=4来补齐,那么它的实际偏移量就为8
(4)结构体的大小为4+8=12
(5)结构体的对齐参数为max(1,4,4)=4,按照结构体的对齐参数来补齐得到结构体的实际大小,那么也就是12(因为12能被4整除,所以不用补齐了)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值