在C++中使用寄存器变量可以做多少坏事



我刚刚知道我们可以在C++程序中显式地使用寄存器。我想知道,如果我在一个C++程序中声明并使用所有可用的寄存器,并运行它相当长的时间,会怎么样。我的系统会有多糟糕,操作系统会采取什么措施(如果有的话)来摆脱这种局面。

编译器将忽略register关键字,这样就不会用完寄存器。无论如何,它很可能会忽略它——编译器通常比人类更擅长寄存器分配。

register关键字向编译器指示变量不需要在主存中寻址。因此,编译器可以确保没有指向该值的指针,并相应地进行优化。

  • 常见的误解:register关键字
  • register关键字(请参阅非Microsoft特定部分)
  • "寄存器";关键字在C中

过度使用register关键字不太可能对现代系统产生严重的负面影响。每个线程在执行期间都维护自己的寄存器值,其寄存器使用不会对其他线程产生任何直接影响。编译器将拒绝或忽略无法生成可行程序的寄存器使用。寄存器使用不当最多只会降低性能,操作系统不会采取任何特殊措施。

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

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

因此,register关键字在现代编译器中唯一能做的就是防止您使用&获取变量的地址。

引用Herb Sutter的话:
从不写入寄存器。它和空白一样有意义

register关键字只是对编译器的一个建议,可以忽略。让编译器为您进行优化。

register关键字只是向编译器礼貌地建议,您认为这个变量会被大量使用,可以吗?请将它保存在寄存器中。编译器可以随意忽略这个建议,事实上,在现代环境中通常会这样做。

register基本上是旧的、效率极低的C编译器的残余,这些编译器早在那时就可用了。(事实上,正是这些编译器导致了令人讨厌的Duff’s Device和其他怪物。)现代编译器比你更能跟踪哪些变量应该放在哪些寄存器中,在执行的哪个点。因此,他们会礼貌地不理你,一句话也不说。

Als发布了Herb Sutter关于关键词的文章链接。我同意萨特的观点,一个人永远不应该使用寄存器。关于登记册是否毫无意义,我与他意见相左。

这比毫无意义更糟糕。

我看到过这样的代码:用寄存器限定的变量后来用"&"。使用寄存器限定的数十个变量的代码。以及终极的doozy,"register volatile foo;"

切勿使用"寄存器"。

所有的CPU寄存器都由您的程序支配,所以使用所有这些寄存器没有什么异常。操作系统甚至不会注意到。

最新更新