Rust 在多大程度上掩盖了零成本?

spr*_*s00 0 shadowing rust

Rust 中的零运行时成本混合列表概述了如何在 Rust 中使用元组和正常特征(不是这个问题建议的特征对象)创建异构列表。该列表似乎在很大程度上依赖于阴影,并且每次添加新元素时都会有效地更改列表的整个类型。

这个实现对我来说似乎很棒,但是在查看了一些 Rust 的主页和资源后,我找不到任何明确定义阴影为零成本的地方。据我所知,重复放弃堆栈上的数据比间接的成本低,但重复复制和添加到现有数据而不是改变它听起来很昂贵。

你不用的东西,你不用付钱。更进一步:你所使用的,你不能更好地编写代码。

  • 比亚恩·斯特劳斯楚普

阴影似乎满足了第一个要求,但第二个呢?

Rust 的影子实际上是零成本的吗?

She*_*ter 8

官方 Rust 材料非常努力地从不单独谈论“零成本”,因此您必须在没有进一步限定的情况下引用您看到“零成本”的地方。该文章声明零运行时成本,因此该帖子的作者知道这一点。在大多数情况下,“零成本”用于零成本抽象的上下文中。

您的 Stroustrup 报价仅部分和间接地涉及零成本抽象。一个更好的解释,强调我的:

这意味着不为抽象付出任何代价,或者换句话说,这意味着无论您使用抽象还是选择“手动”实现,您最终都会获得相同的成本(相同的速度,相同的内存消耗,......)。

这意味着任何时候你看到“零成本抽象”,你都必须有一些东西可以与抽象进行比较;只有这样你才能判断它是否真的是零成本。

我不认为阴影甚至算作抽象,但让我们假装它确实如此(我会说我的答案的其余部分,就好像我相信它一样)。

隐藏变量意味着具有多个具有相同名称的不同变量,后面的变量阻止访问前面的变量。其非“抽象”版本具有多个不同名称的不同变量。我会说拥有两个同名变量的成本与拥有两个不同名称的变量的成本相同,因此它是一种零成本抽象。

也可以看看:


进一步玩这个游戏,你可以问“有两个变量是零成本的抽象吗?”。我会说这取决于变量是什么以及它们如何相关。

在这个例子中,我会说这是一个零成本的抽象,因为没有比我更有效的方式来编写代码了。

fn example() {
    let a = String::new();
    let a = a;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,我想说这不是零成本抽象,因为第一个a在函数结束之前不会被释放:

fn example() {
    let a = String::new();
    let a = String::new();
}
Run Code Online (Sandbox Code Playgroud)

我可以选择编写它的更好方法是drop在中间调用。有充分的理由生锈并没有这样做,但它不是作为有效的问候内存使用手写的实现可以是。

也可以看看: