【发布时间】:2011-01-05 08:08:05
【问题描述】:
我有这样的事情
register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}
它做什么,没关系。代码以现在的方式运行得很快,如果删除了 register 关键字,则运行得更慢。但是,当我在 int n 之前添加寄存器时,它实际上运行速度比现在慢,但比不使用寄存器时快。
谁能给我解释一下?谢谢。
【问题讨论】:
-
目标架构有多少个通用寄存器?还有,什么编译器?
-
您是否在编译时启用了完全优化(例如
-O3)?大多数编译器的优化,包括寄存器分配,默认是禁用的。这使得调试构建的任何时间安排(在-O上编译时没有一些变体)都毫无意义。 -
例如,一种可能性是(使用足够的优化标志)您的编译器更愿意完全优化 n,而是通过推进表示
array+n的指针来循环。也许它会注意您的register关键字,将 n 放入寄存器中并且(因此)不会进行它想要的优化。 但是它的作用很重要 - (1) 它正在生成斐波那契数,所以它是一个小循环,所以我会怀疑任何时间。 (2) a 和 b 没有被初始化,所以优化器基本上可以做它喜欢的事情,并且(因此)产生不可行的快速、损坏的代码。 -
哦,
array+n更快的原因(如果确实如此)可能与寻址模式有关,也可能是因为它使用较少的寄存器,如果你强制额外的寄存器你会在循环中得到堆栈溢出。无论如何,有些这样的事情 - 这段代码很简单,如果你只看两个不同版本的反汇编,你可能会明白为什么较慢的版本更慢。
标签: c cpu-registers