【问题标题】:When should I use smart pointers?什么时候应该使用智能指针?
【发布时间】:2019-11-15 21:55:24
【问题描述】:

对于 C++,有一个类似的、非常流行的 question,但我找不到一个类似的现有 Rust 问题。

那么,BoxRcRefRefMut(其他?)在 Rust 中的用例是什么?

问题的重要部分(对我个人而言):什么时候应该使用智能指针而不是引用?

我知道 The Rust Book 对它进行了非常非常彻底的解释,但我希望有一个关于该主题的简洁快速的“备忘单”,其中可能包含书中缺少的一些真实示例。

【问题讨论】:

  • C++ 问题是在 2008 年提出的。当时的 Stack Overflow 是一个不同的地方,规则、期望和社区规范随着时间的推移而变化。如果今天被问到,许多投票率很高的早期问题将被认为过于宽泛或离题。也就是说,我认为已经有一个 Rust 问题在精神上是相同的......
  • @trentcl 非常感谢您实际上解释了为什么我的问题不适合今天的 SO(我不太同意这个原则,但这是另一个主题),而不是默默地反对。并感谢您的链接!看起来像我需要的。

标签: rust smart-pointers


【解决方案1】:

BoxRcRefRefMut(其他?)在 Rust 中有哪些用例?

好的,我们开始:

  • Box,用最简单的术语来说,用于当你有一个你想保留在堆上的对象时。使用盒子时
  • Rc 在很难决定对象的生命周期时使用。过度使用是懒惰的表现,在某种程度上违背了生命的目的。
  • RefRefMut 是当您尝试访问其内容时由 RefCell 生成的对象。 RefCell 将在运行时而不是编译时跟踪其对象的借用状态,因此它有点像生命周期。例如,当您需要 mutable references to many objects in a hashmap 时,通常会用到它。
  • ArcRwLock (除了下面的内容之外,与RefCell 基本相同)或Mutex 一起使用时,尝试跨线程边界共享对象。他们页面上的示例将向您展示如何使用它们以及为什么它们比使用 Rc<RefCell<T>> 模式更重要。

rust 本身还有一些“智能”指针,但您必须知道,除非您使用了不安全的代码或直接使用全局分配器,否则一切最终都会取消分配其内容。

这与为什么语言中内置的工具(生命周期)对 Rust 如此重要有关,它们完成了 RcRefCell 完成的所有工作,但没有性能缺陷,并且还做了 C/C++ 没有机会做的事情UB。

【讨论】:

  • 如此彻底、高质量的答案!这正是我想要的。非常感谢您的时间和知识。我希望我的问题最终会被赞成或反对,以便其他人能够访问这个宝石(你的答案)。
【解决方案2】:

我给出的简单答案是:尽可能使用参考。不幸的是,了解何时可以依赖于对借用检查器的更深入了解,到那时,我猜备忘单的用处会降低。不过,一些简单的解释可能会有所帮助。

  • 最简单的情况是您有一个明确的所有者,并且引用向下传递到您调用的函数的堆栈。这个案例显然适用于仅供参考。
  • 当您拥有相同的明确所有权但该项目“大”或未确定大小时,您可能需要Box。仍然是单一所有者,可能基于堆栈的借用。
  • 当所有权在树中不明确时,RcArc 将是合适的(与 Mutex 之类的东西共享)。

提到的其他内容(RefRefMut)专门用于借用 RefCell 中包含的内容。 CellRefCell 是可变的容器。

我想说,首先尝试让您的项目拥有,并使用借来的引用来传递它。如果您确实需要分享,请查看RcArc。如果这仍然不起作用,请考虑其他事项。

不过,Rust Book 的描述非常好,你必须对借用有所了解才能对使用什么有一个直觉。

【讨论】:

  • 非常感谢您抽出宝贵时间!我打算选择你的答案,当另一个答案突然出现时,我希望你会同意它更彻底和优美,对我个人来说也更容易理解。不过,我非常感谢您的回答,谢谢。
猜你喜欢
  • 2010-09-11
  • 2011-10-04
  • 2015-10-29
  • 2010-11-02
  • 2010-09-15
  • 2015-10-31
  • 2012-07-02
相关资源
最近更新 更多