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

时间:2011-05-29 12:48:43

标签: c++ linux memory

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

7 个答案:

答案 0 :(得分:24)

编译器将忽略register关键字,因此您不会用完寄存器。无论如何,它可能会忽略它 - 编译器在寄存器分配方面通常比人类好得多。

答案 1 :(得分:15)

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

此外,它只是编译器的一个建议,大多数编译器本身可以进行此优化,因此使用register关键字的用处并不多,因为编译器可能会也可能不会遵循该建议。

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

引用Herb Sutter:
Never write register. It's exactly as meaningful as whitespace

答案 2 :(得分:15)

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

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

答案 3 :(得分:6)

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

答案 4 :(得分:4)

register关键字只是对编译器的一个礼貌建议,你认为这个变量会被大量使用,而且可能很漂亮 - 请将它保存在寄存器中。编译器可以自由地忽略这个建议,事实上,通常会在现代环境中这样做。

register基本上是旧的,效率极低的C编译器的遗留残余,可以追溯到何时。 (事实上​​,同样的编译器导致像可执行的Duff设备和其他怪物这样的东西。)现代编译器比跟踪哪些变量应放在哪些寄存器执行点的能力要强得多。因此,他们会礼貌地无视你,一言不发。

答案 5 :(得分:4)

Als发布了Herb Sutter关于关键词的文章的链接。我同意Sutter的观点,即永远不应该使用注册。我不同意他的注册是否毫无意义。

这比无意义更糟糕。

我见过代码,其中一个用寄存器限定的变量后来与“&”一起使用。使用register注册的数十个和几十个变量的代码。最终的doozy,“注册volatile foo;”

切勿使用“注册”。

答案 6 :(得分:1)

无论如何,所有CPU寄存器都可供您的程序使用,因此使用它们并没有什么特别之处。操作系统甚至都不会注意到它。