代码之家  ›  专栏  ›  技术社区  ›  Mark Ransom

编译器是否优化了未使用的参数?

  •  6
  • Mark Ransom  · 技术社区  · 6 年前

    假设我有一个非常简单的内联函数:

    void Trace(int i)
    {
    #ifdef _DEBUG
        std::cout << i << std::endl;
    #endif
    }
    

    现在我用另一个需要很长时间的函数生成的参数调用这个函数:

    Trace(SlowFunc());
    

    一个合理的编译器会优化调用 SlowFunc()

    1 回复  |  直到 6 年前
        1
  •  8
  •   Marcos Dimitrio Thierry Templier    6 年前

    只有当SlowFunc()被证明没有副作用时,才允许进行优化-但是在实践中,长时间运行的函数通常会有副作用(除非它是某种繁重的计算数学,但是优化器可能会放弃它)。如果证明SlowFunc()没有副作用,则可以优化此调用。

    但我不会依赖它。相反,使用一个只在启用调试时才计算参数的日志解决方案。有几个选择,如果你想要一些指点,请告诉我。