const fn 与内联属性
const fn vs inline attribute
在下面的例子中,我相信当调用函数 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]
属性是否提供与前面示例中的代码相同的权衡(因为函数是在编译时计算的,其结果"inlined" 到呼叫站点)?我们应该用 const
替换所有 #[inline]
属性吗?如果不一样,有什么区别?
#[inline]
和 const
是完全不同的东西,一个不是另一个的超集:
#[inline]
引导 编译器不对是否将函数体内联到调用者做出启发式决定。编译器仍然可以自由地完全或在特定的调用站点忽略此属性,如果它出于任何原因选择这样做,因为内联不会以任何可观察的方式改变程序的行为。
const
是函数签名的一部分,保证函数可以(但不一定is) 在编译时评估。如果可以的话,编译器可以选择在编译时评估函数体,但它可以自由地将其移动到运行时。制作函数 const
的原因是在常量上下文中评估的可能性是函数签名的一部分,以语义稳定的方式保证此 属性 。也就是说,一个可以在 const-context 中调用的函数不应该在没有 semver-bump 的情况下突然丢失这个 属性。
以上是 const
是公开记录的函数签名的一部分而 #[inline]
不是的原因。
所以不,不要盲目地将#[inline]
换成const
。
在下面的例子中,我相信当调用函数 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]
属性是否提供与前面示例中的代码相同的权衡(因为函数是在编译时计算的,其结果"inlined" 到呼叫站点)?我们应该用 const
替换所有 #[inline]
属性吗?如果不一样,有什么区别?
#[inline]
和 const
是完全不同的东西,一个不是另一个的超集:
#[inline]
引导 编译器不对是否将函数体内联到调用者做出启发式决定。编译器仍然可以自由地完全或在特定的调用站点忽略此属性,如果它出于任何原因选择这样做,因为内联不会以任何可观察的方式改变程序的行为。const
是函数签名的一部分,保证函数可以(但不一定is) 在编译时评估。如果可以的话,编译器可以选择在编译时评估函数体,但它可以自由地将其移动到运行时。制作函数const
的原因是在常量上下文中评估的可能性是函数签名的一部分,以语义稳定的方式保证此 属性 。也就是说,一个可以在 const-context 中调用的函数不应该在没有 semver-bump 的情况下突然丢失这个 属性。
以上是 const
是公开记录的函数签名的一部分而 #[inline]
不是的原因。
所以不,不要盲目地将#[inline]
换成const
。