首页 > 解决方案 > C/C++ 编译器会通过重用最近计算的函数结果来优化代码吗?

问题描述

假设我有一个函数double F(double x),并且为了这个示例,我们假设调用F成本很高。

假设我编写了一个f计算 平方根的函数F

double f(double x){
   return sqrt(F(x));
}

在第三个函数中,sum我计算 和 的f总和F

double sum(double x){
   return F(x) + f(x);
}

由于我想最小化F对上述代码的调用,因此与例如相比效率低下

double sum_2(double x){
   double y = F(x);
   return y + sqrt(y);
}

但是因为我很懒,或者很笨,或者想让我的代码尽可能清晰,所以我选择了第一个定义。

无论如何,C/C++ 编译器是否会通过意识到 的值F(x)可以重用于计算来优化我的代码f(x),就像在 中所做的那样sum_2

非常感谢。

标签: c++coptimizationcompiler-optimization

解决方案


C/C++ 编译器是否会通过意识到 F(x) 的值可以重用于计算 f(x) 来优化我的代码,就像在 sum_2 中所做的那样?

也许。两种语言都不需要这种优化,是否允许这种优化取决于F(). 一般来说,不同的编译器在这类事情上表现不同。

f()编译器将函数内联到函数中是完全合理的sum(),这将使它有机会认识到有两个调用会F(x)导致相同的结果。在这种情况下,如果F()没有副作用,那么可以想象编译器只会发出一次对 的调用F(),从而重用结果。

特定的实现可能具有可用于帮助编译器得出此类结论的扩展。但是,如果不对问题应用这样的扩展,我认为编译器不太可能发出只执行一次调用F()并重用结果的代码。


推荐阅读