什么时候在C中使用寄存器?

我有类似的东西

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之前添加寄存器时,它实际上比现在运行得慢,但比没有使用寄存器时更快。

谁可以给我解释一下这个? 谢谢。

register为编译器提供了一个提示,可以将变量放在寄存器中而不是内存/堆栈空间中。 在某些情况下,对于放置此关键字的每个变量,都没有足够的寄存器,因此将其置于太多变量上会导致其他一些变量再次出现在寄存器中。

这只是一个提示,编译器不必采用它。

你是怎么计时的? 在实践中, register通常什么都不做。 当编译器技术非常原始并且编译器无法自己计算出寄存器分配时,这是一个难题。 它应该是一个为该变量分配寄存器的提示,对于非常频繁使用的变量很有用。 如今,大多数编译器只是忽略它并根据自己的算法分配寄存器。

在gcc中,除非指定优化选项,否则绝对不会忽略register。 用这样的东西测试你的代码

 unsigned int array[10]; int n; #define REG register int main() { REG unsigned int a, b, c; for (n = 0; n < 10; ++n){ c = a + b; b = a; a = c; array[n] = c; } } 

你得到(取决于REG是定义还是空)

DIFF http://picasaweb.google.com/lh/photo/v2hBpl6D-soIdBXUOmAeMw?feat=directlink

左侧显示了使用寄存器的结果。

可用的寄存器数量有限,因此将所有内容标记为寄存器不会将所有内容都放在寄存器中。 基准测试是了解它是否会有所帮助的唯一方法。 一个好的编译器应该能够找出自己放入寄存器的变量,因此在决定寄存器关键字有用之前,你应该更多地进行基准测试。

使用寄存器的想法是,您的变量经常被使用。 如果对您的变量进行任何操作,则无论如何都会将其复制到寄存器中。 因此,计数器(索引变量)是此修饰符的候选者。 在2010年1月15日1:57的Diego Torres Milano的例子中,我会这样做:

 unsigned int array[10]; int main() { register int n; unsigned int a = 1, b = 2, c; for (n = 0; n < 10; ++n){ c = a + b; b = a; a = c; array[n] = c; } } 

可分配寄存器有一个限制。 如果你放弃它,你最终会得到效率较低的代码。

我的看法是,如果你做的事情非常重要,你必须自己决定寄存器中的内容以及什么不能,你应该使用汇编语言来编写它。

对于通用语言,我坚信编译器能够更好地决定寄存器中的内容而不是人类。 证据是,虽然您不确定可以在寄存器中放入多少变量,但您的编译器肯定知道。