rust clone() 与 Rc 或 Arc?
rust clone() vs Rc or Arc?
我正在尝试了解以下两者之间的优缺点:
- 使用 Arc 和克隆 Arc(我在各种 places/threads 中使用 Something)
对
- 使用 Something.clone()(我的 Something 结构只有 1 个已经可以克隆的字段)
除了测量和比较性能结果之外,我认为两者中的任何一个都不会在性能方面更差,我正在尝试了解 "generally better" 或 "more idiomatic" 中考虑的内容锈菌的思想。
如果我理解正确的话:
- Arc 和克隆:我在堆上有 1 个东西(与堆栈相比昂贵)+ 我正在克隆 Arc(与 Rc.clone 相比昂贵但如果我需要跨线程使用则需要)所以我 create/drop N 弧取决于我的次数 clone/drop
对比
- Something.clone: 我 create/drop 堆栈中某物的 N 个实例取决于我 clone/drop
的次数
在这种情况下("Something" 的创建成本很低),包裹在 Arc 中与仅克隆相比有什么好处吗?
这两个选项哪个更可取?
in this situation (where "Something" is cheap to create), is there any benefit of wrapping in an Arc vs just cloning it? is any of the two options preferable?
如果您确实只有一个 Arc<Something>
并且克隆了它,那么可能没有。如果你想在线程之间共享某些东西并且所有权不明确,那么 Arc 是必需的,通常你需要在引用计数中使用某种锁以允许修改共享项。
虽然在某些情况下它可以在没有锁的情况下使用,例如内部对象不能(因为它真的是唯一的)或不应该(因为它很昂贵)被复制并且需要被多个线程(不变地)使用(所以你使用 Arc 作为共享单个实例的方式),或者它有时会被复制(而且很昂贵),但通常不会,在这种情况下,您可以 make_mut
在需要 "split" Arc 时 make_mut
但将额外分配推迟到那个点。
我正在尝试了解以下两者之间的优缺点:
- 使用 Arc 和克隆 Arc(我在各种 places/threads 中使用 Something)
对
- 使用 Something.clone()(我的 Something 结构只有 1 个已经可以克隆的字段)
除了测量和比较性能结果之外,我认为两者中的任何一个都不会在性能方面更差,我正在尝试了解 "generally better" 或 "more idiomatic" 中考虑的内容锈菌的思想。
如果我理解正确的话:
- Arc 和克隆:我在堆上有 1 个东西(与堆栈相比昂贵)+ 我正在克隆 Arc(与 Rc.clone 相比昂贵但如果我需要跨线程使用则需要)所以我 create/drop N 弧取决于我的次数 clone/drop
对比
- Something.clone: 我 create/drop 堆栈中某物的 N 个实例取决于我 clone/drop 的次数
在这种情况下("Something" 的创建成本很低),包裹在 Arc 中与仅克隆相比有什么好处吗? 这两个选项哪个更可取?
in this situation (where "Something" is cheap to create), is there any benefit of wrapping in an Arc vs just cloning it? is any of the two options preferable?
如果您确实只有一个 Arc<Something>
并且克隆了它,那么可能没有。如果你想在线程之间共享某些东西并且所有权不明确,那么 Arc 是必需的,通常你需要在引用计数中使用某种锁以允许修改共享项。
虽然在某些情况下它可以在没有锁的情况下使用,例如内部对象不能(因为它真的是唯一的)或不应该(因为它很昂贵)被复制并且需要被多个线程(不变地)使用(所以你使用 Arc 作为共享单个实例的方式),或者它有时会被复制(而且很昂贵),但通常不会,在这种情况下,您可以 make_mut
在需要 "split" Arc 时 make_mut
但将额外分配推迟到那个点。