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

Nit*_*arg 20 c++ linux memory

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

小智 24

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


Alo*_*ave 15

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

此外,它只是编译器的一个建议,大多数编译器可以自己进行这种优化,因此没有太多使用register关键字更多,因为编译器可能会或可能不会遵循该建议.

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

引用Herb Sutter:
永远不要写注册.它和空白一样有意义


Mat*_*ner 15

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

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


jon*_*sca 6

register关键字只是一个建议,编译器和可以忽略不计.让编译器为您进行优化.


JUS*_*ION 5

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

register基本上是旧的、非常低效的 C 编译器的残余,这些编译器可以追溯到很久以前。(事实上​​,同样的编译器导致了诸如可恶的 Duff's Device 和其他怪物之类的事情。)现代编译器比您更能跟踪哪些变量应该在执行中的哪个点放置到哪些寄存器中。因此,他们会礼貌地无视你,一句话也不说。