我是一个常识恶魔,我努力使所有东西尽可能地成为常数.
我已经尝试过查看const和非const函数的各种反汇编输出,但是我还没有看到明显的改进.我现在假设编译器能够使用非const函数做聪明的事情,这些函数在技术上可能是const.
是否还存在const在机器级别有用的情况?任何例子?
Jer*_*fin 18
主要用途const不是生成更好的代码,而是为了保护您自己,确保您不会意外地改变您不想要的东西.
jal*_*alf 12
const实际上帮助编译器优化是非常罕见的.你必须记住,const_cast可以在任何地方使用它来从一个对象中删除constness(虽然实际修改结果对象并不总是定义明确,但在某些情况下,编译器必须小心假设只是因为const对象被传递给一个函数,它不会被修改)
同样,mutable关键字会让事情变得混乱.您可以将const对象传递给函数,但是如果该对象包含mutable字段会怎么样?
编译器必须做很多工作来验证可以安全地假设一个对象真的是不变的 - 当它完成所有这些验证时,const关键字并不重要,因为它可能完全相同对常规非const对象进行分析,以确定它没有被修改并且可以被视为常量.
我不会说没有一些边界情况,const关键字可以启用新的优化,但一般来说,const不是性能考虑因素,而是正确性考虑因素.使用它在编译时捕获更多错误,而不是加速代码.
据我所知,标记函数const的唯一效果是允许在const对象上调用函数.没有优化的好处.
Herb Sutter有一篇文章深入讨论了const和优化:
const在机器级别有用的一个区域是应用于数据时 - const数据可能可以放在不可写的内存中.