代码之家  ›  专栏  ›  技术社区  ›  Eddie Parker

COST(C++)的实用性

  •  5
  • Eddie Parker  · 技术社区  · 15 年前

    我是个警察,我努力使一切尽可能的警察。

    我试过查看函数的const和non-const版本的不同disassembly输出,但是我还没有看到显著的改进。我假设现在的编译器能够用非常量函数做一些聪明的事情,从技术上讲,这些函数可以是常量。

    在机器层面上,const是否仍然有用?有什么例子吗?

    6 回复  |  直到 15 年前
        1
  •  9
  •   Michael Burr    15 年前

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

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

    只有一个领域 常量 在机器级是有用的,当应用到数据时-常量数据可能可以放在不可写的内存中。

        2
  •  18
  •   Jerry Coffin    15 年前

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

        3
  •  12
  •   Stack Overflow is garbage    15 年前

    对于const来说,真正帮助编译器优化是非常罕见的。你必须记住 const_cast 可以在任何地方用于从对象中删除常量(尽管实际修改结果对象并不总是定义良好的,但在某些情况下,它是这样的,因此编译器必须谨慎地假设,仅仅因为常量对象被传递给函数,所以它不会被修改)。

    同样地, mutable 关键词把事情搞砸了。可以将常量对象传递给函数,但如果该对象包含 易变的 字段?

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

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

        4
  •  2
  •   Bruno Reis    15 年前

    目的 const 主要是建筑方面的。当你宣布某物为 康斯特 实际上,你应该思考它代表了什么:不能改变的东西。

        5
  •  2
  •   Mr Fooz    15 年前

    这并不是问题的详细版本的直接答案,但它与标题的问题相匹配。

    我也喜欢非常积极地使用const,部分原因是我认为有一个微小的变化,它将提高性能,但主要是因为它减少了错误,更好地传达了意图。

    1. 拥有const方法允许用户自由拥有有用的const对象。
    2. 拥有常量对象允许库编写器简洁地与用户通信,不管函数或方法是否可以更改输入参数。
    3. 拥有const对象可以让编译器在不小心做了一些修改或者不想修改的事情时对您大喊大叫。
        6
  •  1
  •   Omnifarious    15 年前

    我遵循你的策略,我认为这是作为一个人的主要用处。我在很多编程中采用了非常实用的风格,const帮助实现这一点,并向其他可能正在阅读我的代码的程序员说明这一点。

    事实上,我看到C++将支持的一些新的功能属性对编译器有点帮助。知道一个函数的结果仅仅取决于它的参数,并且不跟随传递给它的任何指针,意味着对该函数的调用可以服从CSE。

    推荐文章