内存对齐那点事

基础

何为内存对齐

现代计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则在空间上排列,而不是按照顺序一个接一个的排放,这种就称为内存对齐,内存对齐是指首地址对齐,而不是说每个变量大小对齐

为什么要内存对齐

我们知道内存的最小单元是一个字节,但是当cpu从内存中读取数据的时候,cpu并不是以字节为单位访问数据,而是将内存当成多个块,每次从内存中读取一个块,这个块的大小可能是2、4、8、16字节等。

如果没有对齐,为了访问一个变量可能产生二次访问。

所以内存对齐是操作系统为了提高访问内存的效率。操作系统在访问内存的时候,每次读取一定长度(这个长度是操作系统默认的对齐数,或者默认对齐数的整数倍)。使用空间换时间,提高了效率。

如何内存对齐

  • 对于标准数据类型,它的存放地址只要是它的长度的整数倍。
  • 对于非标准数据类型,比如结构体,要遵循一下对齐原则:
    1、第一个数据成员要放在offset为0的位置。
    
    2、从第二个数据成员开始 要放在 min(当前成员大小,对齐模数)的整数倍的地方开始位置。
    比如int在32位机器为4字节,#pargama pack(2),即对齐模数为2。那么从2的倍数地方开始存储
    
    3、二次偏移:所有属性计算完后,结构体的总大小为:min(结构体内部最大成员大小, 对齐模数)的整数倍,不足补齐。
    
    4、结构体做为成员的对齐规则。假设A结构体为B结构体的成员,那么结构体A的起点位置为 min(A结构体中最大成员, 对齐模数)。
    
    注意:
    1、对齐模数可以通过#pargama pack(show)查看(默认对齐模数=8字节),也可以通过#pargama pack(n),修改为n
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值