use*_*112 11 c++ performance caching latency
刚刚遇到C++中的register关键字,我想知道这似乎是一个好主意(将某些变量保存在寄存器中)肯定是编译器默认执行此操作?
所以我想知道这个关键字是否还在使用?
小智 13
大多数实现只是忽略register
关键字(除非它强加语法或语义错误).
该标准也没有说任何东西必须保存在登记簿中; 仅仅这是对实现的暗示,变量将经常被使用.它的使用甚至已被弃用.
7.1.1存储类说明符[dcl.stc]
3)寄存器说明符是对实现的暗示,如此声明的变量将被大量使用.[注意:提示可以忽略,在大多数实现中,如果采用变量的地址,它将被忽略.不推荐使用此功能(参见D.2). - 结束说明]
标准说明了这一点(7.1.1(2-3)):
寄存器指定器只应用于块(6.3)中声明的变量名称或函数参数(8.4).它指定命名变量具有自动存储持续时间(3.7.3).在块作用域中声明没有存储类指定的变量或声明为函数参数的变量默认具有自动存储持续时间.
寄存器指定器是对实现的暗示,如此声明的变量将被大量使用.[注意:提示可以忽略,在大多数实现中,如果采用变量的地址,它将被忽略.不推荐使用此功能(参见D.2). - 结束说明]
总结:register
无用,残留,不情愿和弃用.它的主要目的是让那些试图实现自我注册课程并想要命名主要功能的人们的生活更加艰难.register(T *)
只有特定数量的寄存器可用于任何C++程序.
此外,它只是编译器的一个建议,大多数编译器可以自己进行这种优化,因此没有太多使用register
关键字,因此编译器可能会或可能不会遵循该建议.
因此,register
关键字对现代编译器的唯一作用是阻止您使用&
变量的地址.
使用register
关键字只会阻止您在C中获取变量的地址,而在C++中获取变量的地址只会使编译器忽略register
关键字.
底线是,只是不要使用它!
Herb很好地解释:
不是的关键词(或者,另一个名字的评论)
小智 5
对于register
关键字左边唯一远程严重的用途可能是GCC扩展,它允许您使用硬编码的硬件寄存器而无需内联汇编:
register int* foo asm("a5");
Run Code Online (Sandbox Code Playgroud)
这意味着任何访问foo
都会影响CPU寄存器a5
.
当然,这种扩展在非常低级的代码之外几乎没有用处.
归档时间: |
|
查看次数: |
4712 次 |
最近记录: |