对发散函数的尾部调用在Rust中优化了吗?



如果我有以下函数:

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

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

我已经看了一个Playground来展示组装,但是a似乎只是callqb函数。

总是这样吗?

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

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

总的来说,除非您使用#[inline],否则结果将取决于ab的内容。因此,我建议创建某种最小可行的实现,您试图实现ab,然后在编译器资源管理器中进行测试。

最新更新