QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2321|回复: 4

边界对齐

[复制链接]
发表于 2003-5-12 17:23:46 | 显示全部楼层 |阅读模式
这个西西到底是什么?
为什么不对齐速度会慢?
发表于 2003-5-12 17:32:30 | 显示全部楼层
是说编程的时候吗?
回复

使用道具 举报

 楼主| 发表于 2003-5-12 17:47:59 | 显示全部楼层
处理器里的
回复

使用道具 举报

发表于 2003-5-13 06:32:42 | 显示全部楼层
我简单说一下我的理解,不正之处还请各位指正:

我们的cpu(386以后)的指令一般是都是32位对齐(mmx是64位)。所谓对齐按我的理解是cpu每个时钟周期访存取的数据长度,也就是说,x86正常情况下取32位。除非你要取16位(如unsigned short),8位(如unsigned char)。而无论是编译器还是操作系统存放变量的地址必定也是32的倍数(可能表达上有不确切的地方,但大概是这个意思),你其实可以写个小程序看看,在里面放两个全局变量,printf出它们的地址,再放两个局部变量,同样printf地址(它们一个对应编译器安排的静态数据区,一个对应系统动态分配的堆栈)。你可以发现,事实上由于内存分页,分块(这里我也搞不大清楚,要问cheungming),两个连续定义的变量的地址的差别要大于4个字节(我上次试的结果是16个字节)。好了,下面说说什么情况下会出现不对齐:
考虑如下结构:
struct foo {
unsigned long  a;
unsigned short b;
unsigned long  c;
}
当访问a和b的时候,没问题,一个指令周期就取到了。但是,但是:
由于b是16位,c相当于是错开放的,所以取c的话要先取前2个字节,再取后2个字节,要得到c就用去两个时钟周期。如果b是8位,那会更麻烦一些。
所以,一般不象向上面这样定义结构,而会这样:
struct foo {
unsigned long  a;
unsigned long  c;
unsigned short b;
}
或者:
struct foo {
unsigned long  a;
unsigned short b;
unsigned short d;
unsigned long  c;
}
d只是填充。
以上描述没有考虑编译器的优化。
回复

使用道具 举报

 楼主| 发表于 2003-5-13 16:43:37 | 显示全部楼层
My God!!

厉害

谢谢,我再去看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-9-28 04:17 , Processed in 0.035776 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表