内存对齐

来源:互联网 发布:品油邦淘宝店可靠吗 编辑:程序博客网 时间:2024/05/29 02:19

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

如果是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