register关键字是否仍在使用? 刚刚遇到C++中的登记关键字,我想知道这似乎是个好主意(保持登记中的某些变量),编译器肯定是默认的吗?< /P> P> >我想知道这个关键字是否仍然使用?< P>只有特定数量的寄存器对于任何C++程序都可用。p>

register关键字是否仍在使用? 刚刚遇到C++中的登记关键字,我想知道这似乎是个好主意(保持登记中的某些变量),编译器肯定是默认的吗?< /P> P> >我想知道这个关键字是否仍然使用?< P>只有特定数量的寄存器对于任何C++程序都可用。p>,c++,performance,caching,latency,C++,Performance,Caching,Latency,另外,这只是对编译器的一个建议,大多数编译器都可以自己进行优化,因此使用register关键字并没有多大用处,因为编译器可能会也可能不会遵循这一建议 因此,register关键字对现代编译器所做的唯一一件事就是阻止您使用&获取变量的地址 使用寄存器>代码>关键字阻止您在C中获取变量的地址,而在C++中,变量的地址只会使编译器忽略登记登记号>代码>关键字。p> 底线是,不要使用它 赫伯解释得很好: 大多数实现只是忽略register关键字(除非它造成语法或语义错误) 该标准也没有规定任何东西都必须

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

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

使用<代码>寄存器>代码>关键字阻止您在C中获取变量的地址,而在C++中,变量的地址只会使编译器忽略<代码>登记登记号>代码>关键字。p> 底线是,不要使用它

赫伯解释得很好:

大多数实现只是忽略
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*)

的人的生活变得更加艰难。可能
register
关键字剩下的唯一一个远程重要用途是允许您使用硬编码硬件寄存器而无需内联汇编:

register int* foo asm("a5");
这意味着对
foo
的任何访问都将影响CPU寄存器
a5

<> P>此扩展在极低级别代码之外几乎没有用。

< P>从2011 C++标准以来,关键字“登记”已被弃用;看见因此,不应使用它

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


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

但是
inline
不仅仅是一个提示。“注意:内联只是对编译器的提示。编译器不需要内联它。”–Loki Astari“@user997112:这是断章取义的<代码>内联确实有其他真正的含义。“它还在使用吗”完全不是“你应该仍然使用它”。@user997112:如果你要问我,更好地解释“内联”:获取
寄存器
变量的地址是合法的,它不会阻止任何事情。@user997112:我不确定。上次我用寄存器几乎从来没有这样…你能提供一个符合条件的引用吗?@ C++中的Fanael是允许的(变量将不会被登记在登记册中),在C中它是一个错误。“-1”:<代码> int x;<代码>编译,
intregisterx
没有。你说过“它和空白一样有意义”。真的有一个现有的编译器尊重
寄存器
?@axelgneting GCC有(在C中)。你有这个说法的来源吗?我会对此感到非常惊讶。如果在C++11中使用register,当前版本的clang会发出警告。实际上使用了它,只需看看为什么Termux没有openjdk:clang不再支持它,openjdk mobile/jdk9使用它。