编译后的Rust代码汇编输出为何无实际汇编指令?
问题
我在Compiler Explorer中编写了如下Rust代码片段:
fn foo() -> u8 { 54 } fn bar() -> u128 { 3423 } fn main() { let a: (u8, u128) = (foo(), bar()); println!("foo result: {}", a.0); println!("bar result: {}", a.1); }
生成的汇编输出仅包含汇编伪指令,无实现上述函数的实际汇编指令。请问是我使用Compiler Explorer的方式有误(如未设置正确编译标志)?
回答
这是因为Rust编译器默认开启了优化,把foo和bar这类简单函数直接内联到main里了,所以单独的函数实现汇编就被消除了。你可以通过两种方式调整设置来看到完整的函数汇编:
- 将编译等级从默认的
-O(优化模式)改为-C opt-level=0(无优化模式),这样编译器会保留每个函数的独立实现,不会做内联优化 - 如果想保留优化但仍看到
foo和bar的独立汇编,可以给这两个函数加上#[no_mangle]属性,强制编译器保留函数的原始符号和独立实现,修改后的代码如下:
#[no_mangle] fn foo() -> u8 { 54 } #[no_mangle] fn bar() -> u128 { 3423 } fn main() { let a: (u8, u128) = (foo(), bar()); println!("foo result: {}", a.0); println!("bar result: {}", a.1); }
另外,Compiler Explorer默认会过滤掉标准库相关的冗余汇编,你可以在右侧输出选项里勾选"Show all assembly"查看完整汇编内容,但核心问题还是优化导致的函数内联。
内容的提问来源于stack exchange,提问作者Amir reza Riahi
相关产品推荐
相关产品推荐

