gpt4 book ai didi

rust - const fn 与内联属性

转载 作者:行者123 更新时间:2023-12-03 11:32:19 25 4
gpt4 key购买 nike

在下面的例子中,我相信当函数 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] 属性提供与上一个示例中的代码相同的权衡(因为函数已评估在编译时,其结果是“内联”到调用站点)?我们应该用 const 替换所有 #[inline] 属性吗?如果不一样,有什么区别?

最佳答案

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

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

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

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

关于rust - const fn 与内联属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60798676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com