首页 > 解决方案 > 是否在 Rust 中优化了对不同函数的尾调用?

问题描述

如果我有以下功能:

fn a() -> ! {
    b()
}

fn b() -> ! {
    loop {}
}

Rust 是否优化了对简单跳转的此类调用?

我查看了一个Playground展示程序集,但a似乎只是功能。callqb

总是这样吗?

标签: functionrustcalling-conventiontail-call-optimizationtail-call

解决方案


首先,您可以使用 : 告诉编译器内联函数#[inline]:从技术上讲,这并不能保证内联,但它应该在合理的情况下工作。我会推荐使用这个。

其次,如评论中所述,您必须进行优化构建才能看到这种内联。也许一个更好的工具是编译器资源管理器。是您的示例的轻微修改(注意-O编译器选项中的标志)。可以看到,所有的东西都内联到一个无限循环中,如果编译器能证明它是无用的,它甚至可以消除循环中所做的一些工作。

总的来说,除非您使用 ,否则#[inline]结果将取决于 和 的a内容ba因此,我建议为您尝试使用and实现的目标创建某种最小可行的实现b,然后在 Compiler Explorer 中对其进行测试。


推荐阅读