c++ - 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 这将变得非常笨拙。
我知道惰性评估方法,但这将涉及比我想介绍的更多的代码。谢谢
解决方案
理论上,是的,这是可能的。如果您编写单行代码,您还将获得由编译器建模的临时代码。意图的区别在于生命周期和析构函数。当您的编译器可以证明生命周期无关紧要时,它可以这样做。
在实践中,您需要确保编译器可以看到正在发生的事情,要么启用链接时间优化 (LTO),要么通过内联代码。在 A 类和 B 类或其成员之一中使用自定义析构函数没有帮助,尤其是在另一个 CPP 文件中时(如果您没有 LTO)
人们可能想知道担心这些元素是否有意义。通常,分析您的代码并查看您花费最多时间的地方会更有意义。
如果它确实是热路径的一部分,请检查生成的程序集。编译器资源管理器是一个非常好的在线工具,可以帮助您。
推荐阅读
- slack - Slack Web 浏览器和应用程序未在 Ubuntu 上加载
- jupyter-notebook - 如何解决 jupyter notebook 中的 SyntaxError?
- sql-server - 将多个 Excel 工作表导入到一个 SQL Server 表
- r - R中标签的度数符号搞砸了
- nestjs - 使用@UseGuards(JwtAuthGuard)时如何保留swagger doc abd req.user
- postgresql - PostgreSQL - 外部数据包装器用户映射密码
- networking - 可能发送数据时在中间网络节点聚合数据?
- quarkus - Quarkus 中的反应式休息客户端标头注入
- c# - 上传/下载图像时缺少数据
- sql - 如何在 SQL 中检查电话号码的有效性