有问题的 rust 代码是:
#[no_mangle]
fn add(a: isize, b: isize) -> isize {
a + b
}
当与 rustc 命令rustc add.rs --crate-type=lib --emit=asm -C opt-level=z
一起使用时,它会生成以下汇编代码:
.text
.file "add.3a1fbbbh-cgu.0"
.section .text.add,"ax",@progbits
.globl add
.type add,@function
add:
.cfi_startproc
leaq (%rdi,%rsi), %rax
retq
.Lfunc_end0:
.size add, .Lfunc_end0-add
.cfi_endproc
.section ".note.GNU-stack","",@progbits
和以下没有#[no_mangle]
:
.text
.file "add.3a1fbbbh-cgu.0"
.section ".note.GNU-stack","",@progbits
为什么会这样?难道不应该把add
改成像_Zaddm
这样没有杂乱无章的东西吗?
没有#[no_mangle]
,根本就没有发出代码(你看到的只是汇编指令,没有实际的代码)。我猜编译器决定该函数将始终是内联的,因此无需真正为其发出代码(特别是因为您正在优化大小并且内联添加两个值永远不会大于调用函数)。
你想要#[no_mangle]
的唯一原因是如果你打算从 Rust 外部调用该函数。由于显而易见的原因,这样的调用无法内联,因此我假设编译器确实发出代码以使这些外部调用成为可能。