Почему Клиппи предлагает передать Арку в качестве ссылки? - PullRequest
6 голосов
/ 08 апреля 2019

Я проверяю результаты Clippy в моем коде и обнаружил, что педантичное правило needless_pass_by_value может быть ложным срабатыванием.

Это говорит о том, что:

предупреждение: этот аргумент передается по значению, но не используется в теле функции

help: рассмотрите возможность использования ссылки: &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);
    }
}

Детская площадка

1 Ответ

7 голосов
/ 08 апреля 2019

Вызов arc_taker(arc.clone()) увеличивает счетчик ссылок, а возврат с arc_taker снова уменьшает его. В этом случае это бесполезно, поскольку переменная arc, равная main, уже поддерживает Arc в течение всего вызова. Ссылка на это уже будет достаточно. Нет необходимости увеличивать счетчик ссылок вверх и вниз.

В вашем конкретном примере arc_taker даже не заботится о том, что им управляет Arc. Все, что его волнует, это то, что существует от Mutex до lock, поэтому, чтобы сделать вашу функцию менее строгой, просто возьмите &Mutex<MyStruct>.

Если вы хотите сделать с ней какие-либо специфичные для Arc вещи, такие как получение weak_count или чего-то еще, то взятие &Arc<..> имело бы смысл. Если ваша функция будет хранить клон Дуги, только тогда будет иметь смысл взять значение Arc, потому что тогда вызывающая сторона может решить дать вам дополнительную ссылку на нее, вызвав .clone() (таким образом, счетчик ссылок), или чтобы дать вам право владеть собственным Arc (и, следовательно, не увеличивать счетчик ссылок).

...