Rust是否会对发散函数的尾调用执行跳转优化?
你编写的Rust代码如下:
fn a() -> ! { b() } fn b() -> ! { loop {} }
问题解答
- 你观察到的
callq调用是debug构建模式的特有表现:debug模式默认关闭绝大多数编译优化,会保留完整调用栈信息以支撑调试需求,所以不会对这类调用做跳转优化,该表现并非固定存在。 - release优化模式下会生成直接跳转:
!是Rust的永不返回类型,会明确向编译器传递语义:b()执行后永远不会回到a()的执行流,不需要保留返回地址,也不需要处理调用后的返回逻辑。因此编译器可以安全地将这个尾调用优化为jmp指令,不会产生额外的栈帧开销。 - 部分场景下甚至会直接内联逻辑:你示例中的
b()仅包含空死循环,release模式下编译器可能直接将死循环逻辑内联到a()中,连跳转指令都可以省略,a()的汇编会直接对应死循环逻辑。
内容的提问来源于stack exchange,提问作者ruza-net
相关产品推荐
相关产品推荐

