【发布时间】:2021-08-31 09:03:48
【问题描述】:
如果我有以下功能:
fn a() -> ! {
b()
}
fn b() -> ! {
loop {}
}
Rust 是否优化了对简单跳转的此类调用?
我查看了Playground 来显示程序集,但a 似乎只是callq b 函数。
总是这样吗?
【问题讨论】:
-
正如您在操场输出中看到的那样,程序集是在没有优化的情况下生成的:
[unoptimized + debuginfo] -
在使用优化编译操场示例时,
a()和b()都内联到 main 中,并且汇编代码简单地变为.LBB5_1: jmp .LBB5_1。 -
请注意,您很少能保证优化器将要做什么。除非您遇到实际的性能问题,否则我建议不要在意。
-
顺便说一句,为什么您希望这种优化只针对尾调用?
-
.LBB0_1: jmp .LBB0_1=> play.rust-lang.org/…
标签: function rust calling-convention tail-call-optimization tail-call