我有以下 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
如果我不得不猜测,一个没有副作用的函数(例如,您可以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。
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |