免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: superwujc
打印 上一主题 下一主题

[C] 烦请哪位老大可以介绍一下C语言中的内存对齐的原理和实现? [复制链接]

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
1 [报告]
发表于 2012-08-28 13:09 |显示全部楼层
给楼上加2分吧,虽然还是没太看懂。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
2 [报告]
发表于 2012-08-29 11:09 |显示全部楼层
本帖最后由 liuiang 于 2012-08-29 11: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其实就是一个简单变形,参考下图:
  1.   p = memalign(16, 100);
  2.        ______
  3.       |      |
  4.       |      |
  5.         ...
  6.       |      |
  7.       |      |
  8.       |      |
  9.   p-> |______| 0x-------0
  10.       |      | 0x-------F
  11.       |      | 0x-------E
  12.       |      | <- 我是一个管理分配出来的内存块的数据结构对象,我不知道我的起始地址应该是多少,
  13.       |______|    但我知道我的结束地址是根据用户参数内存对齐的,比如这个例子俺们是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和总线相关,
         这里也不展开了。

可能还有一些遗漏,希望有人可以补充。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
3 [报告]
发表于 2012-08-29 12:39 |显示全部楼层
其实我只是路过打酱油的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP