rust - 如何声明一个函数而不实现它?

标签 rust

我想比较函数的不同实现的程序集,但我不想实现某些功能,只需声明它们。

在 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/

相关文章:

rust - 创建具有自定义错误类型的 super 服务

process - 我如何等待标准输出已通过管道传输到另一个的 Rust `Child` 进程?

rust - 为什么堆栈上的项目必须具有在编译时已知的大小?

rust - Cargo.toml 可以包含自定义属性吗

rust - 调用cargo-binutils命令时,是否可以使用xbuild代替build?

rust - 如何运行多个并行调用 thread::sleep 的 future ?

rust - 如何在结构中存储类型为 `impl Trait` 的变量?

rust - 你如何在 Rust 中使用父模块导入?

rust - self 和 self 和有什么不一样?

generics - 实现返回带有闭包的结构的工厂函数