结构体内存对齐(深度刨析结构体大小)

引言

首先我们来看一个例子

看到这个结果12,可能不懂结构体内存对齐的就会感到奇怪。int是8字节,char是1字节,三个成员加起来明明是9个字节,为什么结果是12呢?那我们就带着这个问题继续看下面内容。

结构体内存对齐规则

1.第一个成员在与结构体偏移量为0(即首地址偏移量记为零,向后依次增大)的地址处。

2.其他成员对齐到对齐数(编译器默认的对齐数和该成员大小的较小值,只有VS编译器存在默认为8的对齐数)的整数倍的地址处。

3.结构体大小为所有成员中最大对齐数的整数倍。

4.在结构体中嵌套结构体时,嵌套的结构体对齐到自身最大对齐数的整数倍。

结构体对齐原因

以32位机器为例,在32位机器上,一次性会访问四个字节。由此便会出现如果所占字节为偶数时,但偏移量为奇函数时,出现一次性访问不全的原因,需要多次访问。

例题详解

嵌套结构体

库函数offsetof计算偏移量

该库函数的头文件为<stddef.h>

下面用offsetof验证上面两个代码的偏移量

可以看到用offsetof计算出来的偏移量和我们在上面图片分析的一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值