当使用优化时,rustc 是否总是忽略内联(从不)?

Kyl*_*ean 2 rust

我有以下 Rust 代码:

#[inline(never)]
fn x() -> i32 {
    21
}

pub fn main() -> i32 {
    x()
}
Run Code Online (Sandbox Code Playgroud)

如果没有优化 ( -C opt-level=0),函数调用不会内联,即使#[inline(never)]被删除也是如此。

example::x:
        mov     eax, 21
        ret

example::main:
        push    rax
        call    example::x
        mov     dword ptr [rsp + 4], eax
        mov     eax, dword ptr [rsp + 4]
        pop     rcx
        ret
Run Code Online (Sandbox Code Playgroud)

但是,任何其他优化级别都会导致函数被内联,无论如何。

example::main:
        mov     eax, 21
        ret
Run Code Online (Sandbox Code Playgroud)

我知道该inline属性只是对编译器的建议,但我似乎找不到任何示例,其中 using#[inline(never)]实际上会阻止函数被内联,否则它会被内联。

这是编译器资源管理器结果:https ://godbolt.org/z/WKfevdW37

Apl*_*123 5

如果我不得不猜测,一个没有副作用的函数(例如,您可以const fn没有任何错误地标记它)被视为与内联分开的特殊优化。如果你给出x一个副作用(例如打印一些东西),那么inline(never) 将会产生一个效果:

#[inline(never)]
fn x() -> i32 {
    println!("foo");
    21
}

pub fn main() -> i32 {
    x()
}
Run Code Online (Sandbox Code Playgroud)

这不会内联于opt-level=0or opt-level=2,但如果删除inline(never),那么它将内联于opt-level=2