我正在检查我的代码中的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);
}
}
调用arc_taker(arc.clone())
会增加引用计数,并且从arc_taker
返回会再次减少它。在这种情况下,这是无用的,因为arc
的main
变量已经在整个呼叫期间保持Arc
活着。对它的引用已经足够了。无需上下颠倒引用计数。
在您的具体示例中,arc_taker
甚至不关心它是由Arc
管理的。所有它关心的是有一个Mutex
到lock
,所以为了使你的功能限制较少,只需采取&Mutex<MyStruct>
。
如果你想做任何Arc
特定的事情,比如获得weak_count
或其他什么,拿一个&Arc<..>
会有意义。如果你的函数会保留Arc的克隆,那么只有这样才能通过值获取Arc
,因为然后调用者可以通过调用.clone()
来决定给你一个额外的引用(从而撞击引用计数),或者给你自己的Arc
所有权(因此不会碰到引用计数)。