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

bfo*_*ops 8 c++ const

可能重复:
C++中的常量和编译器优化

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

Kar*_*ldt 17

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


Joh*_*ell 5

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

也就是说,const-correctness应该始终用于其他好处.


Ash*_*ain 5

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
Run Code Online (Sandbox Code Playgroud)

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