【结构体大小怎么求】

要求结构体的大小,那么我们就要了解内存对齐的机制是怎么样的?

一. 内存对齐规则

  1. 比如计算如下结构体大小
struct S1
{
  char c1;
  int i;
  char c2;
};
printf("%d\n", sizeof(struct S1));

如何计算?
首先得掌握结构体的对齐规则:
2. 第一个成员在与结构体变量偏移量为0的地址处。
什么意思看图
在这里插入图片描述

就是第一个成员c1从相对于0偏移量为0,即0这个位置开始存一个字节大小。
3. 那成员i怎么存呢?
那就要看当前系统如果是64位操作系统,默认对齐数为8,32位操作系统默认对齐数为32,那知道这个有什么用?
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

就如上面例子的成员i是int类型字节大小为4,与默认对齐数8比较,4为较小值,所以成员i的对齐数就是4所以成员i要从
对齐数4的倍数开始存,因为上面存了c1之后1不是4的倍数所以要浪费3个字节空间,从4开始往后存4个字节

看图:
在这里插入图片描述
成员c2也一样和默认对齐数8比较1是较小的那个,所以成员c2对齐数为一,所以c2要从对齐数1的倍数开始存,
因为任何数都是1的倍数所以直接从8往后存
看图
在这里插入图片描述

那这个结构体大小就是9了吗?错,不是这样的

  1. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
    这个结构体成员里面,成员i的对齐数是最大的为4,
    所以答案要是4的整数倍
    答案看图:
    在这里插入图片描述
    所以大小为12个字节。

**小编制作不易,承蒙大家一个小小的赞,我会创造更好的作品分享给大家,谢谢兄弟们!

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维生素C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值