是否仍使用了register关键字?

use*_*112 11 c++ performance caching latency

刚刚遇到C++中的register关键字,我想知道这似乎是一个好主意(将某些变量保存在寄存器中)肯定是编译器默认执行此操作?

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

小智 13

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

该标准也没有说任何东西必须保存在登记簿中; 仅仅这是对实现的暗示,变量将经常被使用.它的使用甚至已被弃用.

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

3)寄存器说明符是对实现的暗示,如此声明的变量将被大量使用.[注意:提示可以忽略,在大多数实现中,如果采用变量的地址,它将被忽略.不推荐使用此功能(参见D.2). - 结束说明]

  • 是否真的存在一个尊重`register`的编译器? (5认同)
  • 你有这个说法的来源吗?我会对此感到非常惊讶. (5认同)

Ker*_* SB 7

标准说明了这一点(7.1.1(2-3)):

寄存器指定器只应用于块(6.3)中声明的变量名称或函数参数(8.4).它指定命名变量具有自动存储持续时间(3.7.3).在块作用域中声明没有存储类指定的变量或声明为函数参数的变量默认具有自动存储持续时间.

寄存器指定器是对实现的暗示,如此声明的变量将被大量使用.[注意:提示可以忽略,在大多数实现中,如果采用变量的地址,它将被忽略.不推荐使用此功能(参见D.2). - 结束说明]

总结:register无用,残留,不情愿和弃用.它的主要目的是让那些试图实现自我注册课程并想要命名主要功能的人们的生活更加艰难register(T *).


Alo*_*ave 5

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

此外,它只是编译器的一个建议,大多数编译器可以自己进行这种优化,因此没有太多使用register关键字,因此编译器可能会或可能不会遵循该建议.

因此,register关键字对现代编译器的唯一作用是阻止您使用&变量的地址.

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

底线是,只是不要使用它!

Herb很好地解释:
不是的关键词(或者,另一个名字的评论)

  • "-1":`int x;`compiles,`intregisterx;`没有. (6认同)
  • 取"寄存器"变量的地址是合法的,它不会阻止任何事情. (2认同)
  • 你说*"它和空白一样有意义"*. (2认同)

小智 5

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

register int* foo asm("a5");
Run Code Online (Sandbox Code Playgroud)

这意味着任何访问foo都会影响CPU寄存器a5.

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