有问题的锈代码为:
#[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
之类的东西了吗?
答案 0 :(得分:3)
没有#[no_mangle]
,根本不会发出任何代码(您看到的只是汇编程序指令,没有实际的代码)。我猜编译器决定始终将函数内联,因此不需要真正为其发出代码(特别是因为您正在优化大小,并且将两个值相加就不会比调用函数大)。
您想要#[no_mangle]
的唯一原因是,如果您打算从Rust外部调用该函数。出于明显的原因,无法内联这样的调用,因此我认为编译器确实发出了使这些外部调用成为可能的代码。