rust - const fn 与内联属性
问题描述
在下面的例子中,我相信当函数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]
指导编译器不要做出是否将函数体内联到调用者的启发式决定。编译器仍然可以完全或在特定调用站点忽略此属性,如果它出于任何原因选择,因为内联不会以任何可观察的方式改变程序的行为。const
是函数签名的一部分,并保证函数可以(但不一定是)在编译时进行评估。如果可以的话,编译器可以选择在编译时评估函数体,但它可以自由地将其移动到运行时。制作函数的原因const
是,在 const-context 中评估的可能性是函数签名的一部分,以一种稳定的方式保证此属性。也就是说,一个可以在 const-context 中调用的函数不应该在没有 semver-bump 的情况下突然失去这个属性。
以上是为什么const
是公开记录的函数签名的一部分但#[inline]
不是的原因。
所以不行,不要盲目#[inline]
换const
。
推荐阅读
- c# - 我的 Visual Studio Code 中的区域折叠不起作用
- python - 从多列创建更简单的行
- typo3 - 为 tx_scheduler_task 创建更新任务并正确填写字段 serialized_task_object
- rust - 预期 struct std:vec:Vec 找到 struct std:collections:hash_map:Keys
- prolog - swi prolog中的无向图
- sql-server - 试图将 MS SQL Server 表中的值放入 Excel VBA 中的表单中的列表框
- javascript - Vue.js:如何在选择下拉框中获取选项的属性?
- node.js - 合并没有重复的数组 | 节点 | 蒙哥达
- javascript - 元素未在画布上呈现
- docker - Docker 容器不回复主机中的客户端应用程序