gpt4 book ai didi

rust - 所有权和有条件执行的代码

转载 作者:行者123 更新时间:2023-11-29 07:47:42 25 4
gpt4 key购买 nike

我读了 rust book周末我有一个关于所有权概念的问题。我得到的印象是所有权用于静态确定可以释放资源的位置。现在,假设我们有以下内容:

{                                                 // 1
let x; // 2
{ // 3
let y = Box::new(1); // 4
x = if flip_coin() {y} else {Box::new(2)} // 5
} // 6
} // 7

我很惊讶地看到编译器接受了这个程序。通过插入 println! 并为装箱值实现 Drop 特性,我看到包含值 1 的框将在第 6 行或第 7 行被释放,具体取决于flip_coin 的返回值。编译器如何知道何时释放该框?这是在运行时使用一些运行时信息(比如一个标志来指示盒子是否仍在使用)来决定的吗?

最佳答案

经过一些研究,我发现 Rust currently为每个实现 Drop 特性的类型添加一个标志,以便它知道该值是否已被删除,这当然会产生运行时成本。已经有人建议通过使用 static drops 来避免这种成本。或 eager drops但是这些解决方案在语义上存在问题,即丢弃可能发生在您意想不到的地方(例如,在代码块的中间),特别是如果您习惯了 C++ 风格的 RAII。现在一致认为最好的折衷方案是 different solution从类型中删除标志的位置。相反,标志将被添加到堆栈中,但只有当编译器无法确定何时静态地执行 drop 时(同时具有与 C++ 相同的语义),这特别发生在有条件移动时,如示例在这个问题中给出。对于所有其他情况,将不会产生运行时成本。不过,该提案似乎不会在 1.0 中及时实现。

请注意,C++ 具有与 unique_ptr 相关的类似运行时成本。当实现新的 Drop 时,Rust 在这方面将严格优于 C++。

我希望这是对情况的正确总结。感谢 u/dyoll1013、u/pcwalton、u/!!kibwen、u/Kimundi 在 reddit 上的贡献,以及 Chris Morgan 在 SO 上的贡献。

关于rust - 所有权和有条件执行的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28948716/

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