const的有用性(C++)

Edd*_*ker 5 c++ const

我是一个常识恶魔,我努力使所有东西尽可能地成为常数.

我已经尝试过查看const和非const函数的各种反汇编输出,但是我还没有看到明显的改进.我现在假设编译器能够使用非const函数做聪明的事情,这些函数在技术上可能是const.

是否还存在const在机器级别有用的情况?任何例子?

Jer*_*fin 18

主要用途const不是生成更好的代码,而是为了保护您自己,确保您不会意外地改变您不想要的东西.

  • 什么?`const`不增加安全性?让我们看看,你可以打破一些你可以改变的东西,但你不能打破一些你无法改变的东西...... (7认同)
  • @Hassan:我希望我可以对评论进行投票. (6认同)
  • 不更改我需要查看的项目与从我的视线中删除它不同.`#define`更糟糕,不尊重范围.这是C,而不是C++.您需要重新评估您对语言和良好代码实践的理解. (3认同)

jal*_*alf 12

const实际上帮助编译器优化是非常罕见的.你必须记住,const_cast可以在任何地方使用它来从一个对象中删除constness(虽然实际修改结果对象并不总是定义明确,但在某些情况下,编译器必须小心假设只是因为const对象被传递给一个函数,它不会被修改)

同样,mutable关键字会让事情变得混乱.您可以将const对象传递给函数,但是如果该对象包含mutable字段会怎么样?

编译器必须做很多工作来验证可以安全地假设一个对象真的是不变的 - 当它完成所有这些验证时,const关键字并不重要,因为它可能完全相同对常规非const对象进行分析,以确定它没有被修改并且可以被视为常量.

我不会说没有一些边界情况,const关键字可以启用新的优化,但一般来说,const不是性能考虑因素,而是正确性考虑因素.使用它在编译时捕获更多错误,而不是加速代码.

  • +"当它完成所有这些验证时,const关键字并不重要......" - 这就是关键.另外,总的来说很好. (2认同)
  • 我告诉人们的事情是`const`意味着"只读访问,请"超过它意味着"常量",因为像`mutable`这样的东西,因为`const`对象并不总是位于只读内存中. (2认同)

Mic*_*urr 9

据我所知,标记函数const的唯一效果是允许在const对象上调用函数.没有优化的好处.

Herb Sutter有一篇文章深入讨论了const和优化:

const在机器级别有用的一个区域是应用于数据时 - const数据可能可以放在不可写的内存中.

  • 嵌入式系统,就像我现在正在研究的那样.就速度而言,ROM中的const数据可能比数据在RAM中的速度慢.然而,通常更重要的考虑因素是RAM可能比ROM少得多,所以即使它更慢,一般的偏好是把它放在ROM中.即使在桌面系统上,const数据也可能进入标记为只读的页面 - 它可能没有性能优势,只是正确性(可能它永远不需要进入页面文件 - 但如果这是一个可衡量的差异,你必须有*吨*的const数据). (4认同)
  • 我发现变量的`static const`比`const`快.`const`版本将数据从ROM复制到堆栈,而`static const`版本直接从ROM访问数据.这已在装配清单中得到证实. (2认同)