rust - 什么时候应该在 Rust 中使用内联?

标签 rust inline llvm-codegen

Rust 有一个“内联”属性,可用于这三种风格之一:

#[内联]

#[内联(总是)]

#[内联(从不)]

什么时候应该使用它们?

在 Rust 引用中,我们看到 an inline attributes section

The compiler automatically inlines functions based on internal heuristics. Incorrectly inlining functions can actually make the program slower, so it should be used with care.

在 Rust 内部论坛中,huon 也是 conservative about specifying inline .

但是我们看到considerable usage在 Rust 源代码中,包括标准库。单行函数中添加了很多内联属性,编译器应该很容易根据引用资料通过启发式方法发现和优化。那些实际上不需要吗?

最佳答案

当前 Rust 编译器的一个限制是,如果您不使用 LTO(链接时优化),它永远不会跨包内联未标记为 #[inline] 的函数。 Rust 使用类似于 C++ 的单独编译模型,因为 LLVM 的 LTO 实现不能很好地扩展到大型项目。因此,暴露给其他 crate 的小函数需要手工标记。这不是一个好情况,将来可能会通过对 LTO 和 MIR 内联的一些改进组合来解决。

#[inline(never)] 有时对调试很有用(分离出一段没有按预期工作的代码)。从理论上讲,它可以用于基准测试,但这通常是个坏主意:关闭内联不会阻止其他过程间优化,如常量传播。就普通代码而言,如果您有一个经常使用的仅用于错误处理的辅助函数,它可以减少代码大小。

#[inline(always)] 通常是个坏主意;如果一个函数足够大以至于编译器默认不会内联它,那么它就足够大以至于调用的开销无关紧要(过多的内联会增加指令缓存压力)。有异常(exception),但您需要性能测量来证明它的合理性。 This example是那种值得考虑的情况。 #[inline(always)] 也可用于提高 -O0 代码质量,但这通常不值得担心。

关于rust - 什么时候应该在 Rust 中使用内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37639276/

相关文章:

optimization - 我可以强制 Rust 不优化单个函数吗?

rust - 如何在 Rust 中使用 epoll

rust - 是否可以在特征中使用构造函数?

css - 滑动可扩展内嵌菜单

c++ - 未在函数结果上调用复制构造函数

assembly - 为什么 Rust 编译器不能优化掉 Box::downcast 的错误部分?

mongodb - 如何从 mongodb 游标获取文档集合?

rust - 如何根据 Peekable::peek 的结果调用 Peekable::next?

list - css - 动态宽度水平列表

rust - 如何防止函数调用被优化掉?