我有一个关于 Rust 中的 Arc 的问题。我想做一些多线程的事情,并偶然发现 tokio 和 Arcs 来让多个线程访问相同的数据。目前,我使用的结构体的字段为 Arcs,并且该结构体只是normal。我使用该结构作为某种配置,并将需要它的函数克隆到所需的字段。我的问题是,将结构变量设置为弧形并将字段设置为“正常”,而不是将其交给函数并检索所需的字段,这是更好的做法吗? 我对内存使用和速度差异非常感兴趣;有没有,或者只是为了方便使用其中之一? 感谢您的回答。
我想到的代码:
struct Config{
name: String,
id: u32,
...
}
let myconf = Arc::new(Config::default());
do_stuff(myconf.clone()).await;
...
当前代码:
struct Config{
name: Arc<String>,
id: Arc<u32>,
...
}
let myconf = Config::default();
do_stuff(myconf.name.clone(), myconf.id.clone()).await;
...
Arc
,通常最好将整个结构放在
Arc
后面,而不是每个字段只包含许多 Arc
。这样,克隆和删除更便宜(只需一个引用计数碰撞而不是许多),移动结构更便宜(只需一个指针而不是许多),使用更少的内存(因为每个Arc
需要两个额外的单词引用计数),缓存局部性更好(因为数据是连续分配的,而不是分散在许多地方),并且指针追逐也更少。