【问题标题】:Does declaring C++ variables const help or hurt performance?声明 C++ 变量 const 有助于还是损害性能?
【发布时间】:2011-04-21 11:41:53
【问题描述】:

我了解const 限定数据类型的行为。不过,我很好奇,如果像const 这样的合格变量过热或过热,是否会带来任何性能收益或损失。我特别考虑在隔离代码块中声明和使用的变量。例如,类似:

const qreal padding = CalculatePadding();
const QSizeF page_size = CalculatePagePreviewSize(padding);
const QRectF content_rect = CalculatePagePreviewContentRect(page_size);
const QList<QRectF> pages = renderer.BuildPrintPages(printer_, map_scene_);
const QFont page_number_font = CalculatePageNumberFont();
const QFontMetrics metrics(page_number_font);

假设我在所有这些(以及更多)上只需要const-qualified 方法。将它们全部声明为const 是否有任何性能提升?或者,反过来说,这真的会影响性能吗?

我对运行时性能(我猜这没有什么区别,因为 const 完全是编译时检查——有人可以确认吗?)和编译时性能都很好奇表现。我没有足够的 C++ 经验来感受这一点,我想知道当所有其他事情(可维护性等)都相同时,我是否应该在过度或不足应用 const 方面犯错。

【问题讨论】:

  • 在大多数情况下,没有运行时性能差异
  • Qt 是大量的写​​时复制,所以我怀疑 const 在这里可以产生真正的影响。

标签: c++ performance constants


【解决方案1】:

根据我的(有限的)经验, const 会严重影响性能(惊喜!) 也就是说,在使用容器类时要小心 cont-ness 的作用:对于数组,它可能只是强制编译器在访问单个元素以只读方式访问时创建容器的副本(例如,数组)......这是在我正在处理的代码中找到一个巨大的痛苦。

【讨论】:

    【解决方案2】:

    const 只是帮助您在编译时捕获错误。然而,由于有一个叫做const_cast 的东西,你总是可以改变任何变量的常量,所以编译器真的无法摆脱优化任何东西。 (您还可以通过 c 风格的强制转换来摆脱可能导致优化无效的 constness。)

    【讨论】:

    • 始终避免使用const_cast,只有在别无选择时才使用它(例如:您正在使用无法更改接口的外部库,但知道修改 const对象“足够安全”)。
    • 这不是真的。如果您将变量定义为 const,则不能将其丢弃对其进行写入。基于变量是 const 的事实缓存变量值的编译器是可以的。任何写入 const 变量的程序都有未定义的行为。
    • Johannes - 谷歌搜索 const 和优化的第一个结果:gotw.ca/gotw/081.htm - 自己尝试一下,你可以写入一个未定义的变量
    • 您引用的链接是另一种情况,您获得对可能不是常量对象的常量引用。 Johannes 指的是原始变量声明为const type name,修改name 存在未定义行为的情况。例如,考虑一个符合标准的编译器可以决定将该变量放在 ROM 中而不是常规内存中,或者放在只读内存页面中。在这两种情况下,尝试修改变量都可能会静默失败或使应用程序崩溃。
    • 即如果通过将非 const 对象绑定到常量引用来将 const 属性添加到该对象,则可以抛弃 const 属性并对其进行修改,这没关系。但是你不能抛弃 is const. 的对象的 const-ness
    【解决方案3】:

    虽然从技术上来说答案是“是”,但实际答案是否定的。确实,在某些情况下,编译器可以通过考虑给定值不能更改或方法不会修改拥有对象来执行代码优化。然而,这些将是情境案例,并且在优化的杂草中非常遥远,以至于预先考虑它几乎肯定是错误的。

    【讨论】:

      【解决方案4】:

      const 主要是编译时的东西,然而,声明为const 有时允许某些优化。如果有问题的代码不是性能瓶颈,我不会担心,只需按预期使用const:生成更清晰的代码并防止自己做愚蠢的事情。

      【讨论】:

        【解决方案5】:

        我的理解是编译器可以使用 const 来潜在地优化性能,但不能保证这样;不过,不应该有性能下降。它可能会影响运行时行为(即:编译器可以将 const 变量放在只读内存页上)。

        它应该不会对性能产生重大影响,但是为了便于代码维护,我会错误地更多地使用它。不过,这只是我的看法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-12
          • 2012-02-17
          • 2020-04-10
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          • 2011-10-13
          相关资源
          最近更新 更多