const fn 与内联属性

Mat*_*uth 1 inline compile-time-constant rust

在下面的例子中,我相信当函数Struct::new被调用时,由于#[inline]属性的原因,它的主体将被内联(复制)到调用站点。这将导致生成更多代码和更慢的编译时间,但由于消除了函数调用,因此运行时性能更好。

impl Struct {
    #[inline]
    pub fn new() -> Self {
        // initialization code
    }
} 
Run Code Online (Sandbox Code Playgroud)

现在const fn在 Rust 上是稳定的。当有人将函数声明为 时const,它应该允许编译器在编译时对其进行评估。

impl Struct {
    pub const fn new() -> Self {
        // initialization code
    }
} 
Run Code Online (Sandbox Code Playgroud)

将函数声明为const并省略#[inline]属性是否提供与前一个示例中的代码相同的权衡(因为函数在编译时评估并且其结果“内联”到调用站点)?我们应该用 替换所有#[inline]属性const吗?如果它们不相同,它们之间的区别是什么?

use*_*968 6

#[inline]并且const是完全不同的东西,一个不是另一个的超集:

  • #[inline] 指导编译器不做出是否将函数体内联到调用者的启发式决定。编译器仍然可以自由地完全或在特定的调用站点忽略此属性,如果它出于任何原因选择这样做,因为内联不会以任何可观察的方式改变程序的行为。
  • const是函数的签名和部分保证该功能可以(但不一定在编译时计算)。如果可以,编译器可以选择在编译时评估函数体,但它可以自由地将其移动到运行时。创建函数的原因const是在 const 上下文中评估的可能性是函数签名的一部分,以 semver-stable 方式保证此属性。也就是说,一个可以在 const 上下文中调用的函数不应该在没有 semver-bump 的情况下突然失去这个属性。

以上是const公开记录的函数签名的一部分但#[inline]不是的原因。

所以,不,不要盲目更换#[inline]const