【问题标题】:C++ local variables, performanceC++ 局部变量,性能
【发布时间】:2020-10-09 13:28:26
【问题描述】:

我只是想知道当函数范围内的变量总是相同并且不改变时会发生什么,例如

void test()
{
    int x = 10;
}

我知道编译器会存储有关其名称、大小等的信息,但在这种情况下,它还会缓存其值吗?

我的想法是,如果这是一个每秒使用 60 或 140 次的成员函数。它会对性能产生什么影响,是否应该将其作为成员变量移动以提高性能?

【问题讨论】:

  • 在示例中显示的变量将被优化。所以你需要测试和基准测试。但在大多数情况下,甚至在考虑微基准测试之前都倾向于使用可读代码。
  • 别担心这个。使变量尽可能靠近需要它们的位置。运行代码后,在启用优化的情况下重新编译它,然后对其进行分析以查看其性能。获得这些数据后,您就可以开始着手手动调整代码了。
  • 使其成为会员很可能会降低性能。原始类型的局部变量非常便宜,而且通常根本不需要任何成本。
  • 实际上我已经有了代码,它在 QT 中,我绘制了一个“更复杂”的小部件,其中包含一些 30-140hz 的局部变量,并考虑是否值得将其重构为成员变量。现在一切都很好,没有任何滞后,但我有这样的想法,比如“还好吗?”
  • 如果一个变量不会(不应该)改变,养成使用const(即const int x = 10;)的习惯。它不仅可以帮助您发现错误,还可以帮助编译器找出优化。

标签: c++ compiler-construction performance-testing local-variables


【解决方案1】:

调试符号除外:不,编译器通常不存储局部变量的名称。

与没有这些变量的情况相比,本地自动变量很少有开销。要验证您的程序中是否存在这种情况,您可以进行测量。

在示例函数的情况下,它可能被优化为无操作,并且不会留下局部变量的痕迹。

成员变量通常无法被优化掉,因此不必要地添加这些变量很容易影响性能。效果是否显着,可以通过测量来判断。

【讨论】:

    【解决方案2】:

    就像 cmets 中提到的那样,如果您检查为此类代码生成的程序集,您会发现该变量已被优化掉(甚至在任何意义上都不存在)。

    如果你有这样的功能:

    int test()
    {
        int x = 10;
        return x;
    }
    

    也不会创建变量,但编译器只会让您的函数返回 10。

    至于关于性能的要点,除非你已经有一个可衡量的性能问题,否则我根本不会担心你的常量存储在“哪里”。

    您将很难衡量任何性能影响。

    研究此问题的有用链接包括:

    https://godbolt.org/ 试用您的代码并查看生成的程序集(记得设置编译器标志)

    这个关于测量代码性能的优秀答案:https://stackoverflow.com/a/60293070/567070

    【讨论】:

      【解决方案3】:

      优化程度取决于您的编译设置。 godbolt.org 允许您编译代码并查看编译后的输出。 在这个例子中,gcc9.2 根据优化标志以不同的方式编译你的代码。

      没有优化:

      https://godbolt.org/z/Ej6ado

      局部变量压入堆栈,然后立即从堆栈中弹出。

      使用 -O1 的最低优化:

      https://godbolt.org/z/dnesvs

      您的代码中提到的变量已完全优化,因为它没有被使用:该函数什么都不做并立即返回。

      将变量设为成员变量可能是有害的,因为理论上这将允许它在函数调用之间甚至在函数执行期间发生变化。如果它是一个常量变量,只需在您的函数中将其声明为“const”即可,无需担心优化。

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 2013-03-22
        • 1970-01-01
        相关资源
        最近更新 更多