超级用户 发表于 2003-5-12 17:23:46

边界对齐

这个西西到底是什么?
为什么不对齐速度会慢?

keenor 发表于 2003-5-12 17:32:30

是说编程的时候吗?

超级用户 发表于 2003-5-12 17:47:59

处理器里的

keenor 发表于 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 longa;
unsigned short b;
unsigned longc;
}
当访问a和b的时候,没问题,一个指令周期就取到了。但是,但是:
由于b是16位,c相当于是错开放的,所以取c的话要先取前2个字节,再取后2个字节,要得到c就用去两个时钟周期。如果b是8位,那会更麻烦一些。
所以,一般不象向上面这样定义结构,而会这样:
struct foo {
unsigned longa;
unsigned longc;
unsigned short b;
}
或者:
struct foo {
unsigned longa;
unsigned short b;
unsigned short d;
unsigned longc;
}
d只是填充。
以上描述没有考虑编译器的优化。

超级用户 发表于 2003-5-13 16:43:37

My God!!

厉害

谢谢,我再去看看。
页: [1]
查看完整版本: 边界对齐