内存对齐时为什么结构体的最终大小需要是其最大成员大小的整数倍

本文转自:https://blog.csdn.net/zyz770834013/article/details/71909055


内存对齐时,结构体分配内存大小会满足两个条件:

1. 假设第一个成员的起始地址为0,每个成员的起始地址(startpos)必须是其数据类型所占空间大小的整数倍。

2. 结构体的最终大小必须是其成员(基础数据类型成员)里最大成员所占大小的整数倍。

其中,第一条起始地址特殊要求的原因(实际上就是内存对齐的原因), 主要是提高处理器访问内存的速度

但第二条又是为什么呢?为什么要在所有成员都对齐以后又对整体大小做了要求?

查了一圈没有查到,最后在stackoverflow似乎找到了答案。

贴上原文地址:http://stackoverflow.com/questions/10309089/why-does-size-of-the-struct-need-to-be-a-multiple-of-the-largest-alignment-of-an

以下是看完帖子后的个人理解,若是不对还请各位指出。

个人理解:第二条实际上还是为了内存对齐,如果没有第二条来善后,那第一条的工作就有可能白做了。举个例子

struct st{  
    int32_t a;  
    int8_t  b;  
};  
  
struct st arr[N]; 

struct st{
    int32_t a;
    int8_t  b;
};

struct st arr[N];

结构体 st 如果在最后没有进行填充则应该是5个字节,若做了填充则是8个字节。而底下数组arr的地址分配则会受到结构体 st 大小的影响。

假设数组的起始地址为0,那么

st 为5字节时,arr[0] 占用 0-4,arr[0].a的startpos为0,arr[0].b的startpos为4;arr[1] 占用 5-9,arr[1].a的startpos为5,arr[1].b的startpos为9。可以看到arr[1]的内部成员a并没有对齐(startpos不是其数据类型大小的整数倍),借用帖子里的话 arr[1].a 会cross lines。

st 为8字节时,arr[0] 占用 0-7,arr[0].a的startpos为0,arr[0].b的startpos为4;arr[1] 占用 8-15,arr[1].a的startpos为8,arr[1].b的startpos为12。依次类推数组里所有结构体成员及所有结构体的内部成员都会对齐。

因为基础数据类型的数据大小无非就是1 2 4 8 16字节,若结构体的总大小是最大基础成员大小的整数倍,那么也就一定是其他任一基础成员大小的整数倍,那么每个结构体的startpos就一定是其任一基础成员大小的整数倍 ,这样的话,两条规则结合在一起就保证了所有基础类型数据、非基础类型数据全部对齐。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值