内存对齐

内存分配会返回一个指针,那么对齐就意味着,返回的指针所指向的空间的访问地址是对齐的,

如果是2字节对齐,那么地址最低1bit一定是0,返回地址一定能被2整除,如果是4字节对齐则最低2 bits一定是0,

返回地址一定能被4整除,如果是16字节对齐则最后4bits一定是0,同样该地址可以被16整除。

原理4楼说的很清楚了,就是预先多分配一些空间,然后将返回的地址根据输入的对齐参数,向后偏移,返回即可。

实现则比较多,有一些也比较复杂,网上搜索了一下,建议你先看malloc的实现:

顺便给个链接参考:http://blog.csdn.net/dog250/article/details/5302958

malloc实现理解之后,对齐malloc其实就是一个简单变形,参考下图: p = memalign(16, 100);
__
| |
| |

| |
| |
| |
p-> |__| 0x——-0
| | 0x——-F
| | 0x——-E
| | <- 我是一个管理分配出来的内存块的数据结构对象,我不知道我的起始地址应该是多少,
|__| 但我知道我的结束地址是根据用户参数内存对齐的,比如这个例子俺们是16字节对齐
现在楼主主要问题回答基本完成,既然大家都在扯,我也扯扯。

问题是:我们为什么需要对齐的内存?

简单的回答:效率。但根本原因是—-硬件。反过来说,如果一个处理器或者一个硬件设备,他“可以”访问所有的

地址空间而不管地址是否是对齐的,并且效率完全都是一样的,那么我们可以认为,在这样的系统中,是不需要

专门进行对齐操作。但事实上这种假设在现代计算机系统中基本上是不成立的,主要包括:

1,硬件设备在进行DMA或者其他访问操作的时候,需要cache对齐或者page对齐,典型的是应用程序希望对IO设备
进行直接操作的时候,会采用O_DIRECT选项,事实上是希望系统进行零拷贝,那么对于读写的buf就需要进行
对齐操作,以方便硬件的访问。大部分的外设对内存对齐都会有不同程度的要求,嵌入式领域的SOC要求
格外多。

2,Cache的对齐,楼上大侠们见解都很独到,这里不再罗嗦

3,Cpu本身访问数据的对齐要求。这里包含两个方面:

 第一是有些低端处理器,为了降低复杂度和功耗,设计的时候就需要程序指令对内存的访问必须遵循某些
     对齐要求,比如一些ARM或者MIPS。很多人觉得支持不对齐访问是个很简单的事情,其实不然,如果不对齐
     访问跨cache line,那么处理器需要同时处理器两个cache line的状态,同样推而广之,如果访存指令
     针对的地址跨了page,那么TLB要同时处理器两个page,相关问题可以对照楼上一些讨论编译器,数据类型,
     相关的论述查资料理解,这里也不展开了。

 第二是即使一些处理器支持不对齐访问,但仍旧有一些特殊指令对对齐有限制,典型的是原子指令,如x86下的
     CMPXCHG8B/16B,另外多媒体指令为了提升性能,也有一些有限制,这些都与cache和总线相关,
     这里也不展开了。

参考:http://blog.csdn.net/hemengsi123/article/details/49814957

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值