我应该在代码中使用register关键字吗?

6

我应该在我的phone变量上使用寄存器关键字吗?我有以下代码:

void *anything(Caller *caller)
{
   register void *phone = caller->phone;
   /* or this */
   void *phone = caller->phone;

   if (phone)
   {
       return phone;
   }
   return NULL;
}

有什么区别吗?我应该怎么做?

7
register 关键字在它最初的用途上已经完全过时。我能想到的唯一潜在用途是,如果您希望编译器在任何人尝试获取变量地址时生成错误,则可以使用该关键字。 - R.. GitHub STOP HELPING ICE
6个回答

12

register关键字旨在为编译器提供一种优化提示。问题是,编译器比你更了解你的代码,现在不需要这样简单的提示来生成更好的代码。

因此,现代编译器使用register关键字的唯一作用是防止您使用&获取变量的地址。只有这些。


2
对于一些嵌入式系统仍然非常有用,例如,如果您需要在计时事件中具有亚微秒级别的精度(或确切数量的CPU周期),并且正在在C代码中使用内联汇编。在最近的一个项目中,“register”关键字使我能够用汇编编写5%的代码,而95%的代码则可以轻松地使用C语言编写。如果没有它,我将不得不全部使用汇编语言编写100%的代码。 - vsz
@vsz,有趣的是,我很久以前就没有看到过使用“register”会带来性能提升的情况了。 - sarnold
在我的情况下,这甚至不是关于全面性能的问题。它关于在非常特定的点上的性能,例如在信号生成时,在设置输出之间必须经过确切数量的时钟周期。幸运的是,对于好的嵌入式编译器,register关键字不仅仅是一个提示,而是一个严格的命令... - vsz
例如,通过这种方式,我可以在时间关键的中断或类似情况下使用内联汇编,同时仍然能够在其余代码中使用C语言(并且在C和汇编中使用相同的变量),而不必担心程序会开始推送和弹出寄存器(或者如果我没有将它们推送和弹出,则会破坏变量)因为它们被用于其他事情。 - vsz

5
使用registervoid *一起没有“特殊规则”,register将像对待任何变量一样处理void *,建议编译器将这种变量放入CPU寄存器中,以表明它将被频繁使用。但是,通常情况下没有理由在任何地方使用register,因为当前编译器中包含的优化器比程序员更擅长猜测应该将哪些变量放入寄存器,并且几乎总是会完全忽略register关键字。C99标准还提供了有关register的一些额外细节(§6.7.1 ¶4):声明具有存储类别说明符register的标识符的对象建议尽可能快地访问该对象。这种建议的有效程度是实现定义的。因此,使用register最有可能只获得假装在寄存器中拥有变量的缺点。注意,C++标准放宽了这些限制,但显然,如果您尝试获取register变量的地址,它就不再保留在寄存器中了。长话短说,register主要是过去的遗物,在避免使用它是最好的用法。 :)

3
< p > register 关键字告诉编译器你想将该变量存储在 CPU 寄存器中,而不是系统 RAM 中。一般来说,这是一个糟糕的想法,大多数编译器优化程序可以更好地处理变量,许多编译器完全忽略该关键字。

只需将其删除即可。


2
据我所记,register关键字告诉编译器尝试将变量保存在CPU的寄存器中,以增加局部性原理。程序员知道该变量将被多次访问,因此希望将其保存在可以获得最快速度的内存位置中。
我怀疑现在许多编译器对这种优化比(普通)程序员更加聪明,所以可能不需要使用它。我不会使用它。

1

听起来你根本不应该使用寄存器。

寄存器是编译器放置变量的指令,它们没有类型。你的变量是一个空指针并不相关。

我建议查阅register


0

寄存器存储变量不能应用于指针。因为寄存器变量被放置在机器寄存器中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接