C / C ++编译器会通过重用最近计算的函数结果来优化代码吗?

use*_*304 1 c c++ optimization compiler-optimization

假设我有一个函数double F(double x),为了这个例子,我们假设调用to F的代价很高。

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

double f(double x){
   return sqrt(F(x));
}
Run Code Online (Sandbox Code Playgroud)

而在第三功能sum我计算的总和fF

double sum(double x){
   return F(x) + f(x);
}
Run Code Online (Sandbox Code Playgroud)

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

double sum_2(double x){
   double y = F(x);
   return y + sqrt(y);
}
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢。

Joh*_*ger 8

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

也许。两种语言都不需要进行这种优化,是否允许这种优化取决于的实现细节F()。一般来说,不同的编译器在这种情况下的行为有所不同。

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

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