[在下面的示例中,我相信当调用函数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
?如果它们不相同,有什么区别?
[#[inline]
和const
是完全不同的东西,一个不是另一个的超集:
#[inline]
guides编译器不会做出启发式决定是否将函数主体内联到调用程序中。如果编译器出于某种原因选择了此属性,则它仍然可以完全忽略该属性,也可以在特定的调用站点随意忽略此属性,因为内联不会以任何可观察的方式更改程序的行为。const
是函数签名的一部分,并且保证在编译时评估函数可以(但不一定是is)。编译器可以选择在编译时评估函数体,但可以自由地将其移至运行时。生成函数const
的原因是,在const上下文中求值的可能性是函数签名的一部分,从而以可存储稳定的方式保证了此属性。也就是说,可以在const上下文中调用的函数在没有semver-bump的情况下不应突然失去此属性。以上是const
是公开记录的功能签名的一部分而#[inline]
不是公开文件的功能签名的一部分的原因。
所以,不要盲目地将#[inline]
交换为const
。