当我克隆一个内部有 Arc 的结构时会发生什么?

onx*_*nx2 3 thread-safety rust automatic-ref-counting

我想知道当我克隆struct具有 . 内部属性的a 时会发生什么Arc

#[derive(Clone)]
pub struct Foo {
  bar: Arc<String>
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时cloneFoo会发生什么?在线程之间共享Foo结构并使用底层是否安全Arc,或者我应该这样做吗?

#[derive(Clone)]
pub struct Foo
where
    Foo: Sync + Send,
{
    bar: Arc<String>,
}
Run Code Online (Sandbox Code Playgroud)

我本质上只是试图将一堆结构嵌套到一个结构中,这样我就可以更轻松地与不同的事物共享它们。Arc将包装器结构体作为 an并解开属性会更有意义吗?如果有必要,我可以提供更多背景信息,但现在想保持抽象。

我直接在需要的地方使用了所有弧的非分组版本,这也很好但很麻烦。我不太确定如何测试这个......

caf*_*e25 5

不确定文档中有什么不清楚的地方。

如果所有字段都是克隆,则此特征可以与 #[derive] 一起使用。Clone 的派生实现在每个字段上调用克隆。

对于通用结构体,#[derive] 通过在通用参数上添加绑定克隆来有条件地实现克隆。

文档中Send你可以看到它的内容是否Arc<T>SendSync + Send

如果您更好地单独包装每个字段或整个结构取决于Arc您的用例,但通常每个字段Arc都会产生开销,因此越少越好。