function - 是否在 Rust 中优化了对不同函数的尾调用?
问题描述
如果我有以下功能:
fn a() -> ! {
b()
}
fn b() -> ! {
loop {}
}
Rust 是否优化了对简单跳转的此类调用?
我查看了一个Playground来展示程序集,但a
似乎只是功能。callq
b
总是这样吗?
解决方案
首先,您可以使用 : 告诉编译器内联函数#[inline]
:从技术上讲,这并不能保证内联,但它应该在合理的情况下工作。我会推荐使用这个。
其次,如评论中所述,您必须进行优化构建才能看到这种内联。也许一个更好的工具是编译器资源管理器。这是您的示例的轻微修改(注意-O
编译器选项中的标志)。可以看到,所有的东西都内联到一个无限循环中,如果编译器能证明它是无用的,它甚至可以消除循环中所做的一些工作。
总的来说,除非您使用 ,否则#[inline]
结果将取决于 和 的a
内容b
。a
因此,我建议为您尝试使用and实现的目标创建某种最小可行的实现b
,然后在 Compiler Explorer 中对其进行测试。
推荐阅读
- algorithm - 我在 Maple 中的多项式 GCD 实现给出了错误的结果
- javascript - React js tsx codesandbox问题 抛出了跨域错误,lodash.isequal
- react-native - 编译android时React-native-camera错误,react-native 0.60.5
- javascript - 如何返回带有角度可观察的数字/变量?
- ansible - 如何在一台服务器上使用分子 prepare.yml 而在另一台服务器上运行 playbook?
- css - css问题文本一直在列之外移动,并且标题在滚动时不会保留在原位
- c# - 修改后无法另存为 .docx 文件
- sql - 在sql oracle中添加排序列
- c++ - pjsip TLS connect() 错误:[code=70006]:在 Mac 上未找到 (PJ_ENOTFOUND),但未指定原因
- asp.net - 如何使用 C# 在 ASP.NET 中使用 Crystal Reports 打印 datagidview?