首页 > 解决方案 > C++ 编译器是否可以优化用于将函数结果传递给另一个函数的虚拟变量的使用?

问题描述

在下面的代码片段中:

A a = fxn1(x1, x2, ...);
B b = fxn2(y1, y2, ...);
C c = fxn3(a, b);

编译器是否可以优化使用 fxn1 和 fxn2 的结果创建虚拟变量“a”和“b”,以便将 fxn1 和 fxn2 的结果直接作为参数传递给 fxn3?

我意识到代码可以很容易地写成

C c = fxn3(fxn1(x1, x2, ...), fxn2(y1, y2, ...));

达到同样的目的。但是,如果涉及更多参数并且函数之间存在更多依赖关系,IMO 这将变得非常笨拙。

我知道惰性评估方法,但这将涉及比我想介绍的更多的代码。谢谢

标签: c++optimization

解决方案


理论上,是的,这是可能的。如果您编写单行代码,您还将获得由编译器建模的临时代码。意图的区别在于生命周期和析构函数。当您的编译器可以证明生命周期无关紧要时,它可以这样做。

在实践中,您需要确保编译器可以看到正在发生的事情,要么启用链接时间优化 (LTO),要么通过内联代码。在 A 类和 B 类或其成员之一中使用自定义析构函数没有帮助,尤其是在另一个 CPP 文件中时(如果您没有 LTO)

人们可能想知道担心这些元素是否有意义。通常,分析您的代码并查看您花费最多时间的地方会更有意义。

如果它确实是热路径的一部分,请检查生成的程序集。编译器资源管理器是一个非常好的在线工具,可以帮助您。


推荐阅读