11

刚刚在 C++ 中遇到了 register 关键字,我想知道这似乎是一个好主意(将某些变量保存在寄存器中),编译器是否默认会这样做?

所以我想知道这个关键字还在使用吗?

4

6 回答 6

13

大多数实现只是忽略register关键字(除非它强加了句法或语义错误)。

该标准也没有说任何东西都必须保存在登记簿中。只是它暗示了该变量将经常使用的实现。它的使用甚至被弃用。

7.1.1 存储类说明符 [dcl.stc]

3) 寄存器说明符是对实现的提示,即如此声明的变量将被大量使用。[ 注意:提示可以被忽略,并且在大多数实现中,如果变量的地址被获取,它将被忽略。这种用法已被弃用(见 D.2)。——尾注]

于 2012-05-20T16:20:28.517 回答
7

标准这样说(7.1.1(2-3)):

寄存器说明符仅应用于块中声明的变量名称(6.3)或函数参数(8.4)。它指定命名变量具有自动存储持续时间(3.7.3)。在块范围内声明的没有存储类说明符的变量或声明为函数参数的变量默认具有自动存储持续时间。

寄存器说明符是对实现的提示,即如此声明的变量将被大量使用。[ 注意:提示可以被忽略,并且在大多数实现中,如果变量的地址被获取,它将被忽略。这种用法已被弃用(见 D.2)。——尾注]

总而言之:register是无用的,退化的,返祖的和弃用的。它的主要目的是让那些试图实现自注册类并想要命名 main 函数的人的生活更加艰难register(T *)

于 2012-05-20T16:21:30.030 回答
6

register可能关键字 left的唯一远程严重用途是GCC 扩展,它允许您使用硬编码硬件寄存器而无需内联汇编:

register int* foo asm("a5");

这将意味着任何foo对 CPU 寄存器的访问都会受到影响a5

当然,这个扩展在非常低级的代码之外几乎没有用处。

于 2012-05-20T16:25:28.953 回答
5

对于任何 C++ 程序,只有特定数量的寄存器可用。

此外,这只是对编译器的建议,大多数编译器可以自己进行此优化,因此使用关键字等并没有太多使用,register因为编译器可能会也可能不会遵循建议。

因此,关键字对现代编译器所做的唯一事情register就是阻止您使用&来获取变量的地址。

使用register关键字只会阻止您在 C 中获取变量的地址,而在 C++ 中获取变量的地址只会使编译器忽略该register关键字。

底线是,不要使用它!

Herb 很好地解释了:
不是的关键字(或其他名称的评论)

于 2012-05-20T16:18:47.113 回答
3

不,它没有被使用。这只是一个提示,而且非常微弱。编译器具有寄存器分配器,它们可以确定哪些变量应该保存在寄存器中(并说明您可能从未想过的事情)。

于 2012-05-20T16:20:56.717 回答
0

自 2011 年 C++ 标准以来,关键字“register”已被弃用;请参阅“删除不推荐使用的 register 关键字”。因此不应使用它。

在我自己的实验中,我发现如果使用“register”关键字,由 gcc (v8.1.1) 生成的调试代码确实会有所不同;生成的汇编代码将指定的变量分配给寄存器。基准测试甚至表明此代码运行得更快(比没有“注册”的代码)。然而,这无关紧要,因为发布(优化)代码没有显示任何差异(即,使用“注册”没有效果)。Vacbob在这里指出,如果启用了任何优化,则 gcc 将忽略“注册”。我自己的测试证实了这一点。

所以,总而言之,不要使用“注册”,如果使用“注册”时调试代码运行得更快,请记住优化的发布代码不会。

于 2018-07-16T14:02:53.557 回答