为什么要内存对齐?

为什么要内存对齐?

首先:内存是以字节为单位,但是处理器并不会按照一个字节为单位去存取内存。它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度。对于现代计算机硬件来说,内存只能通过特定的对齐地址(比如按照机器字)进行访问。举个例子来说,比如在64位的机器上,不管我们是要读取第0个字节还是要读取第1个字节,在硬件上传输的信号都是一样的。因为它都会把地址0到地址7,这8个字节全部读到CPU,只是当我们是需要读取第0个字节时,丢掉后面7个字节,当我们是需要读取第1个字节,丢掉第1个和后面6个字节。

假如没有使用内存对齐:

一个整型变量(4 字节),他可以按照任意的起始地址存放,假设现在有一块内存单元:地址从 0~7. 这个整型变量从 地址为 1 的位置开始占据了 1,2,3,4 这 4 个字节. 现在处理器需要读取这个整型变量.由于处理器是 4 字节 4 字节的读取,所以从 0 开始读读取 0,1,2,3发现并没有读完整这个变量,那么需要再读一次,读取 4,5,6,7. 然后对两次读取的结果进行处理,提取出 1,2,3,4 地址的内容.

当我们要读取的字节刚好落在两个机器字(机器字长是指计算机进行一次整数运算所能处理的二进制数据的位数)内时,就出现两次访问内存的情况,同时通过一些逻辑计算才能得到最终的结果。因此,为了更好的提升性能,我们须尽量将结构体做到机器字(或倍数)对齐,而结构体中一些频繁访问的字段也尽量安排在机器字对齐的位置。

转载自:https://xiaozhuanlan.com/topic/3218694705

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值