开启优化选项时rustc是否总会忽略#[inline(never)]属性?
Rust
#[inline(never)] 属性生效验证方法 所有测试均在-C opt-level=2优化等级下执行,排除零优化默认不内联的干扰。
基准测试(无#[inline(never)]属性)
代码如下:
fn x() -> i32 { 21 } pub fn main() -> i32 { x() }
该场景下编译器判定x函数适合内联,最终汇编输出直接优化掉了函数调用:
example::main: mov eax, 21 ret
对比测试(添加#[inline(never)]属性)
仅给x函数添加阻止内联的属性:
#[inline(never)] fn x() -> i32 { 21 } pub fn main() -> i32 { x() }
此时编译器会遵守属性要求,阻止内联行为,保留独立的x函数定义,main函数中保留call调用逻辑,汇编输出如下:
example::x: mov eax, 21 ret example::main: push rax call example::x pop rcx ret
补充说明
- 零优化等级(
-C opt-level=0)下Rust默认不会执行任何内联操作,无论是否添加#[inline(never)]都不会看到效果差异 - 常规优化等级下
#[inline(never)]属于高优先级编译提示,除开启全程序LTO等极端优化场景外,编译器都会遵守该属性要求
内容的提问来源于stack exchange,提问作者Kyle McLean
相关产品推荐
相关产品推荐

