我有类似的东西
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之前添加寄存器时,它实际上比现在运行得慢,但比没有使用寄存器时更快。
有人可以向我解释一下吗?感谢。
答案 0 :(得分:16)
你是怎么计时的?在实践中,register
通常什么都不做。当编译器技术非常原始并且编译器无法自己计算出寄存器分配时,这是一个很大的问题。它应该是一个为该变量分配寄存器的提示,对于非常频繁使用的变量很有用。如今,大多数编译器都会忽略它并根据自己的算法分配寄存器。
答案 1 :(得分:13)
register
为编译器提供了一个提示,可以将变量放在寄存器中而不是内存/堆栈空间中。在某些情况下,对于放置此关键字的每个变量,都没有足够的寄存器,因此将其放在太多变量上会导致其他一些变量再次出现。
这只是一个提示,编译器不必采用它。
答案 2 :(得分:4)
在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是定义还是空)
http://picasaweb.google.com/lh/photo/v2hBpl6D-soIdBXUOmAeMw?feat=directlink
左侧显示使用寄存器的结果。
答案 3 :(得分:1)
可用的寄存器数量有限,因此将所有内容标记为寄存器不会将所有内容都放在寄存器中。基准测试是了解它是否会有所帮助的唯一方法。一个好的编译器应该能够找出自己放入寄存器的变量,因此在决定寄存器关键字有用之前,你应该更多地进行基准测试。
答案 4 :(得分:0)
使用寄存器的想法是,您的变量经常使用。如果您的变量有任何操作,无论如何它将被复制到寄存器中。因此,计数器(索引变量)是此修饰符的候选项。在10年1月15日下午1:57的
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;
}
}
答案 5 :(得分:-1)
可分配寄存器有限制。如果你放弃它,你最终会得到效率较低的代码。
我的看法是,如果你做的事情非常重要,你必须自己决定寄存器中的内容以及什么不能,你应该使用汇编语言来编写它。
对于通用语言,我坚信编译器能够更好地决定寄存器中的内容而不是人类。证据是,虽然您不确定可以在寄存器中放入多少变量,但您的编译器肯定知道。