|
发表于 2006-3-23 14:08:49
|
显示全部楼层
Post by biinn
在上一贴中,我只是凭概念猜想了一下,其中有一个错误:原代码中的 a 是 int 类型,所以即使访问两个相邻的成员, 寻址指针也要加 4, 不能 ++。如果 a 是 char 类型,才可能用 ++ 寻址。但编译时要用优化参数 -O.
经过试验,在我的电脑上 for1.c 和 for2.c 的汇编代码类似, 只是 100 和 1000000 调换了位置, 而且二者的执行时间也几乎是相同的, 没有出现像楼主那么大的差别. 建议楼主多运行几次, 再比较结果.
当我将 a 改为 char 类型后,编译时加上-O 参数,汇编代码的确是用 inc 指令寻址的。 但不解的事情是:此时两个程序不加优化参数编译后的汇编代码是对称的,但执行时间差了 4 倍,而且比 int 的程序慢大约 300 倍。
int 型的 for1.c 的执行时间: 0.005s (real)
char 型的 for1.c 的执行时间:1.4s(real)
char 型的 for1.c 的执行时间:5.6s(real)
为什么 char 的比 int 的慢? 不明白......
指针++表示指向下一个类型单元,并不是地址简单地+1。
因为字节对齐关系,访问int比char快。 |
|