免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2867 | 回复: 11
打印 上一主题 下一主题

关于“对齐” [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-09 13:40 |只看该作者 |倒序浏览
看了一些关于对于对齐的资料,但总有些不理解,比如:
struct {
          int n;
          char c;
          float f;
          double d;
} foo;
使用__alignof__(foo),得到4。请问:
1 为何是4
2 如果foo的地址是40,那么, &foo.n = 40, &foo.c = 44, &foo.f = 48, &foo.d = 52,而d是8对齐,那么,就出现了不对齐的情况?!!(sizeof(foo) == 20)
3 cpu访问内存的颗粒度,是否可以在任务执行过程中被动态的更改?
4 希望牛人可以对对齐给予更多的解释

[ 本帖最后由 fufeiwxy 于 2006-10-9 13:42 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-09 20:54 |只看该作者
用gcc3.4.2编译器
__alignof__(foo)=8
x->d的地址也与8对齐

在实际应用中需要动态改变cpu的颗粒度吗?我想事实上应该没有这样的需求吧

论坛徽章:
0
3 [报告]
发表于 2006-10-10 09:29 |只看该作者
谢谢楼上的!我只是觉得,如果在程序的执行过程中,如果cpu的颗粒度不能改变,那么对于不同的对齐,比如:double的8和int的4以及char的1,还有什么意义?另外,对于一个32位的cpu,double类型的8字节对齐,cpu真的是一次读取8个字节么?

论坛徽章:
0
4 [报告]
发表于 2006-10-10 10:25 |只看该作者
地址对齐是基于以下的原理:以32位CPU为例,当CPU访问4对齐的内存地址时,CPU的访问效率最高,可以在一个周期内完成访问;所以编译器会自动把short(16-bit)变量按2对齐,int(32-bit)变量按4对齐。还有的CPU(比如mips),当CPU访问short变量地址是非2对齐,int变量地址是非4对齐的时候,CPU就会产生一个异常。

CPU的颗粒度是虚拟地址映射的概念,与对齐没什么关系。以x86为例,在保护模式下,一个段的颗粒度可以是1或者4K,一般都会设置成4K,它的意思是,在相同4K范围内的物理地址和虚拟地址是一一对应的。比如物理地址 0 对应虚拟地址 0x80000000,那么 0 + x 就对应 0x80000000 + x ( 0 <= x < 4096)。这就是通常所说的分页。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2006-10-10 10:41 |只看该作者
原帖由 prc 于 2006-10-10 10:25 发表
地址对齐是基于以下的原理:以32位CPU为例,当CPU访问4对齐的内存地址时,CPU的访问效率最高,可以在一个周期内完成访问;所以编译器会自动把short(16-bit)变量按2对齐,int(32-bit)变量按4对齐。还有的CPU(比如 ...

其实有的时候不是访问效率最高的问题,而是升级到无法这样访问的高度

论坛徽章:
0
6 [报告]
发表于 2006-10-10 11:17 |只看该作者
我对“对齐“是这样理解的:
1 首先,澄清cpu访问颗粒度的问题,
   这里我所说的cpu访问颗粒度,不是虚拟地址中映射中那个,而是说对于有些cpu而言,访问内存一次读取2个字节,而有些cpu,一次访问内存读取4个字节到寄存器中,而有的(假设有)可能是一次读取一个字节。
http://www-128.ibm.com/developerworks/library/pa-dalign/
(不知道我翻译的准不准?!)
2 对于颗粒度为4的cpu,当变量的地址以4对齐的时候,cpu的读取效率最高;当颗粒度为2的时候,读取以2对齐的变量的时候,cpu的读取效率最高==>>这样,我推出,因为变量的对齐方式不同,所以,同一个cpu在执行程序的过程中,颗粒度会随之变化。而这种变化,可能是由汇编解释器在翻译成机器代码的过程中而加进的指令,控制cpu的某个管脚,使之变化为一次访问2个或者4个字节。
3 总之是有点乱!

论坛徽章:
0
7 [报告]
发表于 2006-10-10 11:18 |只看该作者
5楼的是什么意思?能不能详细说一下!谢谢了阿

论坛徽章:
0
8 [报告]
发表于 2006-10-10 11:54 |只看该作者
关于对齐的解释,XD认为这篇文章写的很明白了
http://bigwhite.blogbus.com/logs/2005/08/1347304.html

论坛徽章:
0
9 [报告]
发表于 2006-10-10 11:55 |只看该作者
其实不同的系统对齐方式是不一样的,我们只要知道对其的原理就可以了,再根据具体的系统进行分析。

论坛徽章:
0
10 [报告]
发表于 2006-10-10 12:34 |只看该作者
We'll call the size in which a processor accesses memory its memory access granularity.
memory access granularity不是一个可配置的指标,它表示的是CPU处理内存的方式。
由于CPU将内存看成一个个chunk,那么当一个变量跨越2个chunk的时候,那么CPU就需要花费2个周期分别读取这两个chunk,再把着两部分拼起来,效率显然就不如访问对齐的变量高。或者有的CPU为了简单起见,在访问非对齐的变量时就会产生一个异常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP