gpt4 book ai didi

rust - 为什么 Clippy 建议传递 Arc 作为引用?

转载 作者:行者123 更新时间:2023-11-29 07:48:00 24 4
gpt4 key购买 nike

我正在检查代码中的 Clippy 结果,发现 the pedantic rule needless_pass_by_value 可能是误报。

它说:

warning: this argument is passed by value, but not consumed in the function body

help: consider taking a reference instead: &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);
}
}

Playground

最佳答案

调用 arc_taker(arc.clone())增加引用计数,并从 arc_taker 返回再次递减它。在这种情况下这是无用的,因为 arc main 的变量已经保留了 Arc整个通话过程中都活着。对它的引用就足够了。无需上下颠簸引用计数。

在您的具体示例中,arc_taker甚至不关心它是由 Arc 管理的.它只关心有一个 Mutexlock ,所以为了让你的功能限制更少,只需要一个 &Mutex<MyStruct>相反。

如果你想做任何Arc -特定的东西,比如得到 weak_count或其他东西,采取 &Arc<..>会有意义。如果您的函数会保留 Arc 的克隆,那么只有采用 Arc 才有意义。按值,因为调用者可以决定通过调用 .clone() 给你一个额外的引用(从而增加引用计数),或者给你自己的所有权 Arc (因此不会影响引用计数)。

关于rust - 为什么 Clippy 建议传递 Arc 作为引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55576425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com