我想比较函数的不同实现的程序集,但我不想实现某些功能,只需声明它们。
在 Rust 中,前向声明通常是不必要的,因为编译器不需要函数来解析它们(与 C 不同)。但是,是否有可能做一些等同于前向声明的事情?
最佳答案
如果您将函数声明为 #[inline(never)]
您将获得一个函数调用指令,以防止进一步优化。
主要限制是优化后你的函数不能为空,所以它必须有一些副作用(感谢@hellow 建议使用 compiler_fence
而不是 println!
)。
例如,此代码 ( godbolt ):
pub fn test_loop(num: i32) {
for _i in 0..num {
dummy();
}
}
#[inline(never)]
pub extern fn dummy() {
use std::sync::atomic::*;
compiler_fence(Ordering::Release);
}
将产生以下程序集(使用
-O
),我认为您需要:example::test_loop:
push r14
push rbx
push rax
test edi, edi
jle .LBB0_3
mov ebx, edi
mov r14, qword ptr [rip + example::dummy@GOTPCREL]
.LBB0_2:
call r14
add ebx, -1
jne .LBB0_2
.LBB0_3:
add rsp, 8
pop rbx
pop r14
ret
加上
dummy()
的代码那实际上是空的:example::dummy:
ret
关于rust - 如何声明一个函数而不实现它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60702335/