编译器本身是否无法确定一个变量是否为常量?

19 浏览
0 Comments

编译器本身是否无法确定一个变量是否为常量?

我知道对于这样简单的函数,它将被内联:

int foo(int a, int b){
    return a + b;
}

但我的问题是,编译器不能自动检测到这与以下代码相同吗:

int foo(const int a, const int b){
    return a + b;
}

既然可以检测到这一点,为什么还需要在任何地方键入const?我知道inline关键字已经因为编译器的进步而过时了。难道不是时候让const也过时了吗?

0
0 Comments

编译器无法自动确定变量是否为const的原因可能是在复杂的情况下,const可以帮助编译器更好地进行优化。但最重要的是,const可以防止我们无意间修改变量的值。

至于编译器是否能够检测到变量是const的情况,通常是可以的。编译器很可能会对这两个代码示例产生相同的输出。但在更复杂的情况下,const可能对编译器有所帮助。但最重要的是,const可以防止我们无意间修改变量的值。

有可能会出现编译器无法检测到变量为const的情况,比如在不同的翻译单元中。在C/C++编译器模型中,编译器无法访问目标文件,即使它们包含足够的类型信息。它无法知道在其他翻译单元中的函数是否修改了通过引用或指针传递的参数。(链接器可以知道,但这对于代码生成来说太晚了,除非有多次编译/链接运行,比如运行时优化信息,或者非常特殊的集成"complinker")

以上是关于编译器无法自动确定变量是否为const的原因和解决方法的相关内容。希望可以帮助到你。

0
0 Comments

编译器本身无法确定变量是否为const的原因是因为const关键字的存在是为了强制确保变量不被修改。如果没有const关键字,变量的值是可以被修改的。而使用const关键字后,编译器会发出警告。

这是一个语义问题。如果变量的值不应该被修改,那么就使用const关键字,编译器会强制执行这个意图。

编译器可以强制执行const关键字,这也证明它可以在是否指定const的情况下进行相同的优化。我猜测大多数编译器会对指定了const和未指定const但没有被修改的变量生成完全相同的代码。

就像我之前提到的对于inline函数,编译器会根据自己的判断来决定是否进行内联。我对const也是同样的看法。我不再声明函数为inline,因为编译器比我更懂得什么时候进行内联。那为什么我还要声明变量为const呢?

你会为了我之前提到的原因而指定const。即使无论是否指定const都会进行与const相关的优化,但还有其他更好的原因来指定const。指定const的主要原因是你的意图,就像我在回答中说的那样。如果你的意图是const,那就指定为const。

这是否意味着const会给编译器带来指令开销?

0
0 Comments

编译器不能自行确定变量是否为const的原因是,编译器需要看到整个程序以验证事实上的const性质并加以利用,而仅仅声明并不能保证这一点。当编译器可以看到整个程序并且能够证明事实上的const性质时,它实际上当然不再需要const声明了!它可以证明这一点。另外,const在定义处有很大的区别,因为编译器可以将对象存储在只读内存中。

解决这个问题的方法是通过使用整个程序优化/转换来利用const。现代编译器通常都支持链接时代码生成(LTCG)和整体程序优化(LTO)。

Herb Sutter在他的文章中指出,const在优化方面仍然主要用作让人类类设计者更好地实现手工优化的工具,而不是让编译器自动生成更好的代码的标签。

编译器不能自行确定变量是否为const的原因是编译器需要整个程序的信息来验证事实上的const性质,并且const在优化中的作用更多是让人类类设计者实现手工优化,而不是让编译器自动生成更好的代码。

0