c++ - 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/C++ 编译器是否会通过意识到 F(x) 的值可以重用于计算 f(x) 来优化我的代码,就像在 sum_2 中所做的那样?
也许。两种语言都不需要这种优化,是否允许这种优化取决于F()
. 一般来说,不同的编译器在这类事情上表现不同。
f()
编译器将函数内联到函数中是完全合理的sum()
,这将使它有机会认识到有两个调用会F(x)
导致相同的结果。在这种情况下,如果F()
没有副作用,那么可以想象编译器只会发出一次对 的调用F()
,从而重用结果。
特定的实现可能具有可用于帮助编译器得出此类结论的扩展。但是,如果不对问题应用这样的扩展,我认为编译器不太可能发出只执行一次调用F()
并重用结果的代码。
推荐阅读
- python - 在 concurrent.futures.ThreadPoolExecutor 上限制 max_workers 的用例是什么?
- javascript - 如果没有执行 Else 语句
- qt - 应用程序关闭后 Qt 中剪贴板内容的可用性
- mysql - 是否有更清晰的方法来处理不在聚合函数或 GROUP BY 子句中的字段?
- reactjs - 如何使 typesafe-actions 与 redux-logic 转换一起使用?
- html - 如何将html中的®符号斜体?
- airflow - Airflow 1.10.3 - 空白“近期任务”和“DAG 运行”
- angular - 如何在 Angular 中的 DropDown 为空时禁用按钮
- c# - 从存储在 SQL 中的 byte[] 数组重新创建二维双精度数组
- django - 如何通过 Django Channels 将 cookie 添加到标头?