【问题标题】:rust clone() vs Rc or Arc? [closed]rust clone() vs Rc 还是 Arc? [关闭]
【发布时间】:2020-06-10 10:44:57
【问题描述】:

我试图了解以下之间的利弊:

  • 使用 Arc 并克隆 Arc(我在各个地方/线程中使用了一些东西)

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

除了测量和比较性能结果(我认为这两者中的任何一个都不会比性能更差)之外,我试图了解在 rustaceans 心目中被认为“通常更好”或“更惯用”的东西。

如果我理解正确:

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

对比

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

在这种情况下(“某些东西”的创建成本很低),包装在 Arc 中而不是克隆它有什么好处? 这两个选项中的任何一个更可取吗?

【问题讨论】:

  • 克隆通常更简单。更简单通常更好。
  • 如果结构很小并且你想要不可变引用克隆可能是有意义的。请记住,如果您的项目范围发生变化并且您需要将您的结构放入 RefCell 或其他东西中,那么重构这些克隆将比一直在 Arc / Rc 中花费更多的精力。
  • 我投票决定以“需要详细信息”来结束这个问题,因为我不确定在没有具体用例的情况下可能有什么答案。所有关于软件架构的问题都归结为“你会用它做什么?”如果你试图抽象出所有相关的细节,你将不会得到好的答案。

标签: rust clone reference-counting


【解决方案1】:

在这种情况下(“某些东西”的创建成本很低),包装在 Arc 中而不是克隆它有什么好处?这两个选项中的任何一个更可取吗?

如果您实际上只有一个 Arc<Something> 并且您克隆了它,那么可能没有。如果您想在线程之间共享某些东西并且所有权不明确,则 Arc 是必需的,通常您需要在 refcount 中设置某种锁以允许修改共享项。

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

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2012-02-03
    相关资源
    最近更新 更多