问题描述
|
我只是知道我们可以在C ++程序中显式使用寄存器。我想知道如果我在单个C ++程序中声明并使用所有可用的寄存器并在相当长的时间内运行它会怎样?我的系统将表现得多么糟糕,操作系统将采取何种措施来解决这种情况。
解决方法
关键字“ 0”向编译器指示该变量不需要在主存储器中可寻址。因此,编译器可以确保没有指向该值的指针并相应地进行优化。
常见的误解:register关键字
注册关键字(请参阅非Microsoft特定部分)
C中的“注册”关键字?
过度使用register关键字不太可能对现代系统产生严重的负面影响。每个线程在执行期间都会维护自己的寄存器值,并且其寄存器使用情况不会对其他线程产生任何直接影响。编译器将拒绝或忽略无法使用可行程序的寄存器使用情况。寄存器使用不当最多只会降低性能,操作系统不会采取任何特殊措施。
, 编译器将仅忽略
register
关键字,因此您不会用完寄存器。无论如何,它都可能会忽略它-编译器在寄存器分配方面通常比人类要好得多。
, C ++程序仅可使用特定数量的寄存器。
而且,这只是对编译器的建议,大多数编译器可以自己进行优化,因此实际上更多地使用register
关键字没有太大用处,因为编译器可能会也可能不会遵循建议。
因此,register
关键字对现代编译器唯一的作用是防止您使用&
来获取变量的地址。
在此引用Herb Sutter的观点:
永远不要写寄存器。与空白完全一样有意义
, register
关键字仅是编译器的建议,可以忽略。让编译器为您进行优化。
, register
关键字仅是对编译器的一种礼貌建议,即您认为此变量将被大量使用,是否可以将其保存在寄存器中。编译器可以随意忽略此建议,实际上,通常会在现代环境中这样做。
“ 0”基本上是旧的,效率非常低下的C编译器的残留痕迹,而C编译器可以追溯到那时。 (实际上,导致诸如Duff's Device和其他可执行文件之类的事情的编译器都是相同的。)现代编译器比您拥有更强大的功能,可以跟踪哪些变量应该放入哪个寄存器中执行的哪个位置。因此,他们会礼貌地无视您,只字不提。
, Als发布了指向Herb Sutter关于关键字的文章的链接。我同意萨特的观点,即永远不要使用寄存器。对于注册是否毫无意义,我不同意他的看法。
比没有意义还糟。
我看过代码,其中带有寄存器限定符的变量后来与\“&\”一起使用。带有数十个变量的代码,这些变量具有寄存器资格。而最终的傻瓜,“注册volatile foo;”
切勿使用“注册”。
, 无论如何,所有CPU寄存器都可以由程序使用,因此使用它们都没有什么例外。操作系统甚至都不会注意到它。