题
我有这样的事
register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}
它做什么,不要紧。该代码跑得快,现在是这样的,如果慢寄存器关键字已被移除。然而,当我在寄存器INT前N添加,实际上它运行比现在更慢,但快于如果没有寄存器被使用。
有人可以解释这样对我?感谢。
解决方案
register
给编译器的提示以将变量在寄存器而非存储器/堆栈空间。在某些情况下,不会有足够的寄存器为每个变量你把这个关键字就这么把它放在太多的变量可以再次迫使一些其他的寄存器中进行的。
这是只是一个提示,虽然和编译器不必须把它
其他提示
你是怎么这个时间?在实践中,通常register
什么也不做。这是从当编译器技术是极其原始和编译器无法弄清楚寄存器分配自己的一块克鲁夫特的。它应该是分配一个寄存器变量的提示,是非常常用的变量是有用的。如今,大多数编译器简单地根据自己的算法忽略它和分配寄存器。
在GCC,寄存器是绝对不能忽视的,除非你指定优化选项。 像这样的东西测试代码
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?技艺=直接连结
在左侧示出了使用的寄存器的结果。
有可用的寄存器的数量有限,所以标记一切,寄存器将不会把一切都在寄存器中。标杆是知道它是否会帮助或不是唯一的方式。一个好的编译器应该能够找出哪些变量投入寄存器对自己,所以你也许应该基准一些您认为寄存器关键字帮助之前。
使用寄存器的想法是,你的变量被用于非常频繁。如果您的变量的任何操作,它无论如何都会被复制到寄存器。所以计数器(指标变量)是这种修饰的候选人。在示例中的迭戈托雷斯米兰的从1月15日在'10 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;
}
}
有向分配的寄存器的限制。如果明显优于它,你刚结束了代码效率不高。
我的看法是,如果你做的是如此的重要,你必须在寄存器中发生的事情,什么不能做,你应该用汇编语言写出来。决定自己
有关通用语言,我坚信,一个编译器能够更好地确定在比人类寄存器发生的事情。该证据是,虽然你不知道你能有多少变量放在寄存器,编译器知道是肯定的。