结构体对齐规则及示例

为什么要进行内存对齐(以空间换时间)

为了有助于加快计算机的取数速度,编译器默认会对结构体进行处理(实际上其
它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基数据类型(int等)都位于能被4整除的地址上,能整除的话一次就读完了,会节省很多时间,这样两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。

结构体对齐规则

1. 第一个成员在与结构体变量偏移为0的地址处
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
vs中的默认值为8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己最大对齐数的整数倍处,
结构体的整体大小就是所有最大对齐数(含嵌套结构体的大小)

示例1:
在这里插入图片描述
对于c1来说它占一个字节,vs编辑器默认为8,所以它的对齐数为1
对于 i 来说,它占四个字节,vs编辑器默认为8,所以它的对齐数为4,也就是它要放之前前面的格子必须它(4)的整数倍,所以前边空了三个格子(红笔写的为空的数)
对于c2来说它占一个字节,vs编辑器默认为8,所以它的对齐数为1,也就是它要房之前前面的格子必须是1的整数倍,所以直接放,然而结构体总大小为最大对齐数的整数倍1+3+4+1=9还差三个才是最大对齐数(在这个代码中最大对齐数为4)的整数倍,所以9+3=12,也就是这个结构体大小为12

示例2:
在这里插入图片描述
1 (c1) + 1(c2) + 2(int对齐) + 4(int大小) = 8 即这个结构体大小为8

示例3:
在这里插入图片描述
8(double大小) + 1(char大小) + 3(int对齐) + 4(int大小) =16

示例4: 划重点

在这里插入图片描述
struct S3 s3 这个结构体大小为 16 ,它内部最大对齐数 为8
1(char大小) + 7(结构体变量s3对齐) + 16(结构体s3所占空间大小) + 8(double大小)
总值为32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值