是寄存器关键字仍在使用?(Is the register keyword still used?)

2019-06-24 15:15发布

用C跨register关键字刚刚++,我不知道,因为这似乎是一个好主意(保持一定的变量在寄存器)肯定是编译器在默认情况下做到这一点?

所以我想还是用这个关键字?

Answer 1:

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

该标准还没有说什么必须保持在寄存器中; 只是它的一个暗示,这个变量将被经常使用的实现。 它的使用,即使已被弃用。

7.1.1存储类说明[dcl.stc]

3)寄存器指定符是一个提示,如此声明的变量将被频繁使用的实现。 [注:该提示可以忽略不计,而且在大多数的实现,如果变量的地址是它会被忽略。 这种使用已过时(见D.2)。 - 注完]



Answer 2:

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

寄存器SPECI音响ER应只应用于块中的(6.3)或发挥功能参数(8.4)声明的变量名。 它SPECI科幻上课已命名的变量具有自动存储持续时间(3.7.3)。 一种可变声明没有在框范围存储类-SPECI音响ER或声明为函数参数具有默认自动存储持续时间。

寄存器SPECI网络ER是一个提示,如此声明的变量将被频繁使用的实现。 [注:该提示可以忽略不计,而且在大多数的实现,如果变量的地址是它会被忽略。 这种使用已过时(见D.2)。 - 注完]

总结: register是没用的,遗迹,隔代遗传和弃用。 它的主要目的是为了让人们更难谁试图实现自我注册类的生活,要命名的主要功能register(T *)



Answer 3:

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

register int* foo asm("a5");

这将意味着任何接入foo会影响到CPU的寄存器a5

当然,该扩展的非常低级的代码之外很少使用。



Answer 4:

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

此外,它只是对编译器的建议大多是编译器可以做到这一点的优化自己,所以没有真正多大用处使用的register关键字等更是因为编译器可能会或可能不会遵循的建议。

所以唯一register关键字现代编译器的作用是阻止你使用&取变量的地址。

使用register关键字只是阻止你采取在C变量的地址,而在C ++中取变量的地址只是让编译器忽略register关键字。

底线是, 只要不使用它!

奈斯利由Herb解释说:
这不是关键字(或由另一名评论)



Answer 5:

不,它不使用。 这只是一个提示,而且是非常弱的。 编译器有注册分配器,他们可以找出哪些变量保存在寄存器(和占事情你可能从来没有想过)。



Answer 6:

“登记”的关键词,因为2011 C ++标准已被弃用; 看到“删除登记关键字的使用已过时” 。 因此不应使用。

在我自己的实验,我发现通过GCC(v8.1.1)生成调试代码,如果使用“注册”关键字确有不同; 生成的汇编代码分配指定变量的寄存器。 基准甚至表明,这种代码的运行速度提高(比代码没有“登记”)。 这是无关紧要的,然而,如释放(优化的)码显示没有差异(即,使用“登记”没有效果)。 Vacbob指出这里 ,如果启用任何优化,然后GCC忽略“注册”。 我自己的测试证实了这一点。

所以,综上所述,不使用“登记”,如果调试代码出现在脑海的时候“注册”是用来运行速度更快,熊,优化后的版本代码不会。



文章来源: Is the register keyword still used?