我正在检查代码中的Clippy发现,发现the pedantic rule needless_pass_by_value
可能是误报。
它说:
警告:此参数按值传递,但不会在函数体内使用
帮助:考虑改用参考文献:
&Arc<Mutex<MyStruct>>
由于克隆Arc
仅是引用计数,因此移动Arc
并不是一个坏主意。在质量和性能方面,发送参考而不是Arc
的值真的有什么区别吗?
#![warn(clippy::pedantic)]
use std::sync::{Arc, Mutex};
fn main() {
let my_struct = MyStruct { value: 3 };
let arc = Arc::new(Mutex::new(my_struct));
arc_taker(arc.clone());
}
fn arc_taker(prm: Arc<Mutex<MyStruct>>) {
prm.lock().unwrap().do_something();
}
struct MyStruct {
value: i32,
}
impl MyStruct {
fn do_something(&self) {
println!("self.value: {}", self.value);
}
}
答案 0 :(得分:7)
调用arc_taker(arc.clone())
将增加引用计数,而从arc_taker
返回将再次减少引用计数。在这种情况下,这是没有用的,因为arc
的{{1}}变量在整个调用过程中已经使main
保持活动状态。引用它就足够了。无需增加引用计数。
在您的特定示例中,Arc
甚至都不关心它是由arc_taker
管理的。它只关心Arc
到Mutex
之间的距离,因此,为了减少对函数的限制,只需改用lock
。
如果您想对它进行任何&Mutex<MyStruct>
特定的操作,例如获取Arc
之类的东西,那么服用weak_count
就很有意义。如果您的函数保留了Arc的克隆,那么只有按值取&Arc<..>
才有意义,因为调用者可以决定通过调用Arc
来给您附加引用(因此会增加参考计数),或者为您提供自己的.clone()
的所有权(因此不会增加参考计数)。