#include <stdio.h>
register int i = 10;
int main(void)
{
printf( " i = %d \n ", i );
return 0;
}
这里我将变量i声明为寄存器。但是,在编译时显示以下错误
" error: register name not specified for ‘i’ "
为什么我们不应该在全局使用register关键字?
答案 0 :(得分:10)
register
变量是一种局部变量
这是一个提示,将值存储在寄存器中以便更快地访问
寄存器变量不能是全局的或静态的
它只能在一个块中定义
另请格式化您发布的代码
答案 1 :(得分:3)
register
变量不能用作“全局”变量,因为文件范围变量具有静态存储,因此根据定义它们具有地址。 register
变量恰恰相反,这些变量是程序员承诺从不接受其地址的变量。因此,将两者结合起来没什么意义。
BTW,你得到的错误信息不是很有帮助。您的编译器似乎指的是允许将register
变量修复到特定硬件寄存器的扩展。如果您发布此类错误消息,请同时指出您正在使用的编译器和/或平台。
答案 2 :(得分:0)
我们之所以不应该在全局变量中使用register关键字,是因为定义为 register 存储类的变量的寿命在定义该变量的块之内。
总是可以比存储在存储器中的值更快地访问存储在CPU寄存器中的值。因此,如果在程序中的许多地方都使用了变量,则最好将其存储类声明为 register 。
循环变量是一个很好的例子,我们可以将它们的存储类命名为寄存器。
#include<stdio.h>
int main()
{
register int i;
for(i=1;i<=10;i++)
printf("%d\n",i);
return 0;
}
答案 3 :(得分:-3)
register
的使用在大多数现代编译器上已经过时。不要使用它。
过去,编译器不够智能,无法确定最常访问哪些变量,因此应在寄存器中分配永久位置。但现代编译器使用静态单一赋值和通过着色进行寄存器分配等技术,这样编译器在知道何时变量应该在寄存器中以及何时应该“溢出”到存储器时要比你好得多。
此外,register
对其变量施加了限制。你不能有一个指向register
变量的指针,因为指针指向内存位置,而变量不在内存中(至少在概念上)。并且register
变量必须是自动变量 - 通常称为“堆栈”变量。因此,它必须是函数中的局部变量,并且不能被限定为static
或extern
。
简而言之,使用register
从未在现代编译器中提供性能提升,但确实会给程序员带来麻烦。过早优化的最大武器 - 浪费程序员的时间与执行时间节省的错误承诺 - 再次罢工。