高速缓存存储器为什么要对齐

缓存为什么要对齐(Z)  

 引言:高速缓存存储器位于CPU和内存之间。

  对于普通代码,内存边界对齐也是有好处的,可以降低高速缓存(Cache)【介于CPU和内存间的一个存储条】和内存交换数据的次数。      
  主要问题是在于Cache本身是分成很多Cache-Line,每条Cache-Line具有一定的长度,比如一般来说L1   Cache每条Cache   Line长度在32个字节或64个字节;而L2的会更大,比如64个字节或128个字节。  
  用户每次访问地址空间中一个变量,如果不在Cache当中,那么就需要从内存中先将数据调入Cache中。  
  比如现在有个变量   int   x;占用4个字节,它的起始地址是0x1234567F;那么它占用的内存范围就在  
  0x1234567F-0x12345682之间。如果现在Cache   Line长度为32个字节,那么每次内存同Cache进行数据交换时,都必须取起始地址是32(0x20)倍数的内存位置开始的一段长度为32的内存同 Cache   Line进行交换.  
  比如0x1234567F落在范围0x12345660~0x1234567F上,但是0x12345680~0x12345682落在范围0x12345680~0x1234569F上,也就是说,为了将4个字节的整数变量0x1234567F~0x12345682装入Cache,我们必 须调入两条Cache   Line的数据。但是如果int   x的起始地址按4的倍数对齐,比如是  
  0x1234567C~0x1234567F,那么必然会落在一条Cache   Line上,所以每次访问变量x就最多只需要装入一条Cache   Line的数据了。比如现在一般的malloc()函数,返回的内存地址会已经是8字节对齐的(与8字节对齐,而不是与Cache  Line的32字节对齐,那是出于不浪费内存空间的想法,因为比如与32字节对齐的一个内存地址和另一个与32字节对齐的内存地址相差32*N字节,现在有两个内存地址A(低地址)、B(高地址)间相差32字节,若在地址A上分配1个字节的内存给进程,则剩下的31字节都浪费点不用的。且8字节的倍数也很有可能是32字节的倍数),这个就是为了能够让大部分程序有更好的性能。  
  而对于SSE,SSE2,MMX等,经常需要处理长度为32字节,64字节,128字节的数据;同样,将这些内存块的起始地址按对样长度对齐,可以减少访问Cache   Line的次数。

 

参考:

http://blog.163.com/wbwubo@126/blog/static/1621012062010311114551249/

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值