我是一个常识恶魔,我努力使所有东西尽可能地成为常数。
我已经尝试查看const和非const版本函数的各种反汇编输出,但我还没有看到明显的改进。我现在假设编译器能够使用非const函数进行智能操作,这些函数在技术上可能是const。
是否还存在const在机器级别有用的情况?有什么例子吗?
答案 0 :(得分:18)
const
的主要用途不是生成更好的代码,而是为了保护您自己,确保您不会意外地更改您不想要的内容。
答案 1 :(得分:12)
const实际上帮助编译器优化的情况非常少见。你必须记住,const_cast
可以在任何地方用来从对象中删除constness(虽然实际修改结果对象并不总是定义明确,但在某些情况下,编译器必须小心假设只是因为const对象被传递给一个函数,它不会被修改)
同样,mutable
关键字会让事情变得混乱。您可以将const对象传递给函数,但是如果该对象包含mutable
字段会怎么样?
编译器必须做很多工作来验证可以安全地假设一个对象真的是不变的 - 当它完成所有这些验证时,const
关键字并不重要,因为它可以对常规非const对象进行所有相同的分析,以确定它没有被修改并且可以被视为常量。
我不会说没有一些边界情况,const关键字可以启用新的优化,但一般来说,const
不是性能考虑因素,而是正确性考虑因素。使用它在编译时捕获更多错误,而不是加速代码。
答案 2 :(得分:9)
据我所知,标记函数const的唯一效果是允许在const
对象上调用函数。没有优化的好处。
Herb Sutter有一篇文章深入讨论了const和优化:
const
在机器级别有用的一个区域是应用于数据时 - const数据可能可以放在不可写的内存中。
答案 3 :(得分:2)
const
的目的主要是建筑的目的。当您将某些内容声明为const
时,您应该考虑它所代表的内容:无法改变的内容。
答案 4 :(得分:2)
这不是您问题详细版本的直接答案,但它与标题的问题相符。
我也非常喜欢使用const,部分是因为我认为它会有一点改变,它会提高性能,但主要是因为它可以减少错误并更好地传达意图。
答案 5 :(得分:1)
我遵循你的策略,我认为这是对人类的主要用处。我在很多编程中采用了非常实用的风格,const帮助强制执行并向其他可能正在阅读我的代码的程序员说明。
事实上,我看到C ++ 0x将支持的一些新函数属性对编译器更有用。知道函数的结果完全取决于它的参数,并且不遵循传递给它的任何指针意味着对函数的调用可以接受CSE。