const是否有助于优化器? C ++

时间:2010-10-09 15:00:10

标签: c++ const

  

可能重复:
  Constants and compiler optimization in C++

让圣战开始: 我听说过很多关于const在C ++中的用处的不同意见。当然它在成员函数声明等中有用。但它作为变量(或更确切地说,常量)的修饰符有用吗?如果剩下的代码保持不变,它确实对优化器有帮助吗?

4 个答案:

答案 0 :(得分:17)

在很多情况下,const修饰符对优化器没有帮助,因为编译器已经可以判断您是否修改了变量这一简单事实。在我看来,const的最大好处是它告诉编译器程序员是否打算修改该变量,这对于在编译时而不是运行时查找某些类型的语义错误很有用。任何可以转移到编译时间的错误都会大大提高程序员的工作效率。

答案 1 :(得分:5)

一般来说,不,它对编译器没有帮助。由于在C和C ++中,const-ness可以在一秒钟内生成,因此编译器很难对优化的满足代码要求做出必要的假设。

尽管如此,const-correctness应该始终用于其他好处。

答案 2 :(得分:4)

const对优化程序没有帮助。

由于const可以被const_cast丢弃,因此可以在许多地方编写使用const的程序,然后将其丢弃并修改变量,并定义行为按照标准。因此编译器必须查看程序的实际代码以确定哪些变量在何时被修改,并且无论如何它可能相当不错(例如,它可能确定非常量变量在某个代码块上是不变的并且相应地进行优化)。

如果编译器盲目地将const视为某些事物不会改变的保证,那么优化器会破坏一些格式良好的程序。

const是一个编译时功能,可以帮助程序员编写正确的代码,添加一些编译时约束,并指示代码契约(例如'我保证不会更改此参数')。它与优化无关。虽然不变量对优化器很重要,但这与const关键字无关。

有一个例外:用const声明的对象。这些不能修改;即使它们是通过铸造,行为也是不确定的。这里有一些微妙之处:

const int ci = 5;
const_cast<int&>(ci) = 5; // undefined behavior, original object declared const

int i = 5;
const int& ci2 = i;        // cannot modify i through ci2, const reference
const_cast<int&>(ci2) = 5; // OK, original object not declared const

因此,当编译器看到const int ci时,它可能 假设它永远不会改变,因为修改它是未定义的行为。但是,这可能不是你的程序的瓶颈,它只是一个更复杂的#define。除此之外,const很弱 - 只是类型系统的关键字。

答案 3 :(得分:0)

它不会受到伤害,理论上可以允许一些优化,所以你也可以使用它 - 不知道是否有任何生产编译器。