编译器是否可以自行确定变量是否为const?

Jon*_*Mee 12 c++ const qualifiers

我知道这个函数很简单,它将被内联:

int foo(int a, int b){
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

但我的问题是,编译器无法自动检测到这与以下内容相同:

int foo(const int a, const int b){
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

既然可以检测到这一点,为什么我需要在const任何地方输入?我知道inline由于编译器的进步,关键字已经过时了.是不是该const做同样的时间?

ten*_*our 19

您不会const因不修改变量而放置.您const用来强制您不要修改它.如果没有const,您可以修改该值.有了const,编译器会抱怨.

这是一个语义问题.如果该值不应该是可变的,那么使用const,编译器将强制执行该意图.

  • 你说的原因你会指定`const`.即使你指定`const`发生了`const`相关的优化,还有其他更好的理由来指定它.指定`const`的*primary*原因是你的意图,就像我在答案中所说的那样.如果你MEAN`const`,那么指定`const`. (3认同)
  • 我删除了我的上一条评论; 我想我知道你要去哪里更好.编译器可以强制执行`const`的事实也证明它可以进行相同的优化,无论你是否指定`const`.我猜大多数编译器因此会为指定的`const`和非指定的`constst`-but-not-modified-生成完全相同的代码. (2认同)

Pet*_*ica 13

是的,编译器可以在您的示例中证明constness.

不,这没用:-).

更新: Herb Sutter专注于他的一个问题(http://www.gotw.ca/gotw/081.htm).摘要:

  • const通过使编译器和链接器为const对象选择函数来帮助最多,包括可以编码为更有效的const成员函数.
  • const对通常的翻译单元模型没有帮助[与我的假设不同]; 编译器需要查看整个程序来验证事实常量(仅仅声明不保证)并利用它,以及证明没有别名......
  • ... 编译器可以看到整个程序并且可以证明事实常数时,它实际上当然不再需要const声明了!它可以证明这一点.咄.
  • const产生重大影响的地方是定义,因为编译器可能将对象存储在只读存储器中.

当然,这篇文章值得一读.

关于整个程序优化/翻译,这通常是利用constness cf所必需的.以下评论来自amdn和Angew.

  • 我喜欢这个.但后来我想知道,除了语言律师之外,是否有一种语言可以保证超过100个通常非平凡的问题. (2认同)

jua*_*nza 9

不能编译器只是自动检测这是否与...相同

如果你的意思是编译器是否可以检测到在第二种情况下没有修改变量,很可能是肯定的.编译器可能会为两个代码示例生成相同的输出.但是,const在更复杂的情况下可能有助于编译器.但最重要的一点是它可以防止无意中修改其中一个变量.

  • @JonathanMee最有可能是不同的翻译单位.C/C++编译器模型中的编译器(与例如c#模型相对)无法访问目标文件,即使它们包含足够的类型信息.它不能知道不同TU中的函数不会修改ref或指针传递的参数.(链接器会,但是代码生成为时已晚,除非有一个运行时优化信息运行多个编译/链接,或者一个不寻常的,集成的"complinker"). (4认同)
  • @PeterSchneider这实际上是我见过的最好的答案.我想接受,如果你可以输入它作为答案,先生. (2认同)

Gal*_*lik 9

编译器将始终知道您做了什么,并将从中推断内部常量以优化代码.

编译器永远不知道的是你想要做什么.

如果您希望变量保持不变但稍后在代码中意外更改,则编译器只能告诉编译器您想要的内容时才会捕获此错误.

这就是const关键字的用途.