0

我是读C99的老外,而一句话(在6.7.1中)让我很困惑:

  • '(使用存储类说明符寄存器声明对象的标识符建议尽可能快地访问对象。)这些建议的有效程度是实现定义的。'

我应该如何解析第二句话:

  • 这些建议的有效程度是由实现定义的。
  • 这些建议的有效程度是由实现定义的。

哪一个更好?

这是否意味着实现具有决定如何处理register的全部权力,即使终止翻译?

谢谢。

4

3 回答 3

1

不要将register变量与 CPU 的寄存器混为一谈。这些不一样。

register目的是允许优化。禁止获取此类变量的地址,因此此类变量永远不能别名,编译器始终掌握其最新值。因此,它可以很容易地实现这样的变量,例如 CPU 寄存器或汇编程序立即数。

作为一个特定的子案例,有一些const限定register变量不能被程序直接改变,也不能被其他通过指针访问的代码在幕后改变。只有这样的变量可以很容易地保证在整个程序执行过程中保持不变。

于 2012-06-25T05:57:01.557 回答
0

不——建议的有效程度是由实现定义的,但代码的整体效果不是。

稍微不同的是,当/如果您放入register代码中(在允许的情况下),编译器可以完全忽略它——我觉得有义务补充一点,几乎所有合理的现代编译器都会.

尽管如此,仅仅存在register不会阻止代码编译,除非您尝试将它应用到不允许的地方(例如,应用到全局变量)。

底线:不要使用它,但也不要担心从已经拥有它的代码中删除它。这是浪费时间和精力,但是对于相当现代的编译器来说,这是一个完全无害的编译器。

于 2012-06-25T04:45:29.867 回答
0

注册是一个古老的关键字。基本上它是对优化器的一个提示,告诉它最好使用寄存器来存储这个变量。您提到的短语意味着编译器可以以任何它想要的方式处理这个提示。在我们优化编译器的时代,99% 的意义和价值毫无意义。

于 2012-06-25T04:43:23.110 回答