rust clone() 与 Rc 或 Arc?

use*_*504 8 clone reference-counting rust

我试图了解以下之间的优缺点:

  • 使用 Arc 并克隆 Arc(我在不同的地方/线程中使用 Something)

  • 使用 Something.clone() (我的 Something 结构只有 1 个已可克隆的字段)

除了测量和比较性能结果(我认为两者中的任何一个在性能方面都不会差很多)之外,我还试图了解在锈类动物的头脑中什么被认为是“通常更好”或“更惯用”。

如果我理解正确的话:

  • Arc 和克隆:我在堆上有 1 个东西(与堆栈相比昂贵)+我正在克隆 Arc(与 Rc.clone 相比昂贵,但如果我需要跨线程使用则需要),所以我根据方式创建/删除 N 个 Arc很多次我克隆/删除

  • Something.clone:我在堆栈上创建/删除 N 个 Something 实例,具体取决于我克隆/删除的次数

在这种情况下(“某些东西”的创建成本很低),与仅克隆它相比,将其包装在 Arc 中是否有任何好处?这两个选项中哪一个更可取?

Mas*_*inn 3

在这种情况下(“某些东西”的创建成本很低),与仅克隆它相比,将其包装在 Arc 中是否有任何好处?这两个选项中哪一个更可取?

如果你真的只有一个Arc<Something>并且你克隆了它,那么可能不会。如果您想在线程之间共享某些内容并且所有权不清楚,则 Arc 是必要的,通常您需要在引用计数内使用某种锁以允许修改共享项目。

尽管在某些情况下它可以在没有锁的情况下有用,例如内部对象不能(因为它确实是唯一的)或不应该(因为它很昂贵)被复制并且需要(不可变地)被多个线程使用(所以你使用 Arc作为共享单个实例的一种方式),或者有时会复制(并且昂贵),但通常不会,在这种情况下,您可以在make_mut需要“拆分”Arc 时而不是创建急切的副本,但可以推迟额外的分配观点。