当前Rust编译器的一个限制是,如果您没有使用LTO(链接时优化),它将不会在跨crate使用未标记#[inline]
的函数中进行内联。 Rust使用类似于C ++的分离编译模型,因为LLVM的LTO实现在大型项目中无法扩展。因此,需要手动标记向其他crate公开的小函数。这不是一个很好的情况,未来可能通过改进LTO和MIR内联的某种组合来修复。
#[inline(never)]
有时用于调试(分离预期不起作用的代码段)。理论上,它可以用于基准测试,但那通常是个坏主意:关闭内联不会阻止其他过程间优化,例如常量传播。对于常规代码而言,如果您有一个仅用于错误处理的常用辅助函数,则可以减少代码大小。
#[inline(always)]
通常是个坏主意;如果一个函数够大以至于编译器默认不会将其内联,那么它足够大以至于调用的开销并不重要(过度内联增加指令缓存压力)。当然也有例外,但需要性能测量来证明其必要性。 这个例子是值得考虑的情况之一。 #[inline(always)]
也可用于改善-O0
代码质量,但通常不值得担心。
inline(never)
用于panic内置函数上,以确保优化器不会将仅在panic情况下调用的函数进行内联。 - oli_obk#[inline] pub fn f() { g() }
这样的东西,如果希望将g
内联到另一个板条箱中的f
的调用者中,是否也应该注释#[inline]
? - eggyal