const fn vs inline attribute

问题描述 投票:0回答:1

[在下面的示例中,我相信当调用函数Struct::new时,由于#[inline]属性,其主体将内联(复制)到调用站点。由于消除了函数调用,这将导致生成更多的代码并降低编译时间,但会提高运行时性能。

impl Struct {
    #[inline]
    pub fn new() -> Self {
        // initialization code
    }
} 

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

impl Struct {
    pub const fn new() -> Self {
        // initialization code
    }
} 

是否将函数声明为const并省略#[inline]属性提供了与上一个示例中的代码相同的折衷(因为该函数在编译时求值,并且其结果“内联”到了调用中-现场)?是否应将所有#[inline]属性替换为const?如果它们不相同,有什么区别?

rust inline compile-time-constant
1个回答
0
投票

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

  • #[inline] guides编译器不会做出启发式决定是否将函数主体内联到调用程序中。如果编译器出于某种原因选择了此属性,则它仍然可以完全忽略该属性,也可以在特定的调用站点随意忽略此属性,因为内联不会以任何可观察的方式更改程序的行为。
  • const是函数签名的一部分,并且保证在编译时评估函数可以(但不一定是is)。编译器可以选择在编译时评估函数体,但可以自由地将其移至运行时。生成函数const的原因是,在const上下文中求值的可能性是函数签名的一部分,从而以可存储稳定的方式保证了此属性。也就是说,可以在const上下文中调用的函数在没有semver-bump的情况下不应突然失去此属性。

以上是const是公开记录的功能签名的一部分而#[inline]不是公开文件的功能签名的一部分的原因。

所以,不要盲目地将#[inline]交换为const

© www.soinside.com 2019 - 2024. All rights reserved.