Clippy가 Arc를 참조로 전달하는 것을 제안하는 이유는 무엇입니까?

아키 너 알칸

내 코드에서 Clippy 결과를 확인 하고 있는데 현학적 인 규칙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. 그것이 신경 쓰이는 것은 Mutexto 가 있다는 것입니다. lock따라서 함수를 덜 제한적으로 만들려면 &Mutex<MyStruct>대신 a를 사용하십시오.

또는 무언가를 Arc얻는 것과 같은 특정 작업 을 수행 하려면 weak_counta를 취하는 &Arc<..>것이 합리적입니다. 함수는 주변의 아크의 복제를 계속 할 경우에만 다음은 걸릴 나을 Arc다음 호출자가 호출하여 당신에게 그것에 추가 참조를 제공하기로 결정 할 수 있기 때문에, 값 .clone()(즉 참조 카운트를 해주), 또는에 자체 소유권을 제공 Arc하므로 참조 횟수가 증가하지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Array.find가 값이나 참조를 반환합니까? 나는 가치로 전달하거나 참조로 전달하는 것을 의미합니까?

분류에서Dev

이것이 가치를 전달하는 이유는 무엇입니까?

분류에서Dev

환경 변수를 통해 비밀을 전달하는 것이 "매우 안전하지 않은"것으로 간주되는 이유는 무엇입니까?

분류에서Dev

환경 변수를 통해 비밀을 전달하는 것이 "매우 안전하지 않은"것으로 간주되는 이유는 무엇입니까?

분류에서Dev

이것이 전역 개체를 참조하는 이유는 무엇입니까?

분류에서Dev

이것이 전역 개체를 참조하는 이유는 무엇입니까?

분류에서Dev

JS가 참조로 객체를 푸시하는 이유는 무엇입니까?

분류에서Dev

목록을 매개 변수로 전달하는 것이 생성기를 전달하는 것보다 더 나은 이유는 무엇입니까?

분류에서Dev

ReSharper가 참조를 제안 할 때 NuGet 패키지를 추가하지 않는 이유는 무엇입니까?

분류에서Dev

Swift에서 inout 함수를 참조하여 const 값을 전달할 수없는 이유는 무엇입니까?

분류에서Dev

map ()에 전달 된 클로저가 참조를받지 않고 filter ()에 전달 된 클로저가 참조를받는 이유는 무엇입니까?

분류에서Dev

인수로 전달 된 참조가 함수를 통해 변수를 수정하는 데 작동하는 이유는 무엇입니까?

분류에서Dev

객체가 참조를 통해 자동으로 전달되는 이유는 무엇입니까?

분류에서Dev

참조로 전달되는 입력 임시 인수에 대한 참조를 반환하는 것이 가능합니까 / 합법적입니까?

분류에서Dev

프로그래머가 "참조로 전달"이 실제로 "값으로 참조를 전달"한다고 말하는 이유는 무엇입니까? 그게 왜 중요할까요?

분류에서Dev

연산자 + 오버로드가 참조로 전달 되었음에도 불구하고 복사 생성자를 호출하는 이유는 무엇입니까?

분류에서Dev

참조를 선언하고 참조로 전달하는 것과 동일하게 전달합니까?

분류에서Dev

참조로 배열을 전달할 때 변수가 정의되지 않았다는 컴파일러 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

이 합성 함수가 참조로 전달 될 때 잘못된 순서로 함수를 적용하는 이유는 무엇입니까?

분류에서Dev

Linux가 시스템을 이전 안전 상태로 복원하기 위해 중단 점 복구를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

Linux가 시스템을 이전 안전 상태로 복원하기 위해 중단 점 복구를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

비 관리 코드로 전달하는 동안 ByRef가 예외를 제공하는 이유는 무엇입니까?

분류에서Dev

약한 자체를 정적 함수의 클로저로 전달하는 것에서 유지주기가 발생하는 이유는 무엇입니까?

분류에서Dev

"변수 만 참조로 전달해야합니다"오류가 발생하는 이유는 무엇입니까?

분류에서Dev

여기에 참조로 포인터를 전달하면 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

벡터가 const 참조로 전달 되었는데도 값으로 전달 된 것처럼 처리되는 이유는 무엇입니까?

분류에서Dev

참조로 전달하면 재귀 오류가 수정되는 이유는 무엇입니까?

분류에서Dev

natty가 Firefox 베타 버전으로 업그레이드를 제안하는 이유는 무엇입니까?

분류에서Dev

참조로 함수에 전달 된 변수가 값을 즉시 변경하지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    Array.find가 값이나 참조를 반환합니까? 나는 가치로 전달하거나 참조로 전달하는 것을 의미합니까?

  2. 2

    이것이 가치를 전달하는 이유는 무엇입니까?

  3. 3

    환경 변수를 통해 비밀을 전달하는 것이 "매우 안전하지 않은"것으로 간주되는 이유는 무엇입니까?

  4. 4

    환경 변수를 통해 비밀을 전달하는 것이 "매우 안전하지 않은"것으로 간주되는 이유는 무엇입니까?

  5. 5

    이것이 전역 개체를 참조하는 이유는 무엇입니까?

  6. 6

    이것이 전역 개체를 참조하는 이유는 무엇입니까?

  7. 7

    JS가 참조로 객체를 푸시하는 이유는 무엇입니까?

  8. 8

    목록을 매개 변수로 전달하는 것이 생성기를 전달하는 것보다 더 나은 이유는 무엇입니까?

  9. 9

    ReSharper가 참조를 제안 할 때 NuGet 패키지를 추가하지 않는 이유는 무엇입니까?

  10. 10

    Swift에서 inout 함수를 참조하여 const 값을 전달할 수없는 이유는 무엇입니까?

  11. 11

    map ()에 전달 된 클로저가 참조를받지 않고 filter ()에 전달 된 클로저가 참조를받는 이유는 무엇입니까?

  12. 12

    인수로 전달 된 참조가 함수를 통해 변수를 수정하는 데 작동하는 이유는 무엇입니까?

  13. 13

    객체가 참조를 통해 자동으로 전달되는 이유는 무엇입니까?

  14. 14

    참조로 전달되는 입력 임시 인수에 대한 참조를 반환하는 것이 가능합니까 / 합법적입니까?

  15. 15

    프로그래머가 "참조로 전달"이 실제로 "값으로 참조를 전달"한다고 말하는 이유는 무엇입니까? 그게 왜 중요할까요?

  16. 16

    연산자 + 오버로드가 참조로 전달 되었음에도 불구하고 복사 생성자를 호출하는 이유는 무엇입니까?

  17. 17

    참조를 선언하고 참조로 전달하는 것과 동일하게 전달합니까?

  18. 18

    참조로 배열을 전달할 때 변수가 정의되지 않았다는 컴파일러 오류가 발생하는 이유는 무엇입니까?

  19. 19

    이 합성 함수가 참조로 전달 될 때 잘못된 순서로 함수를 적용하는 이유는 무엇입니까?

  20. 20

    Linux가 시스템을 이전 안전 상태로 복원하기 위해 중단 점 복구를 제공하지 않는 이유는 무엇입니까?

  21. 21

    Linux가 시스템을 이전 안전 상태로 복원하기 위해 중단 점 복구를 제공하지 않는 이유는 무엇입니까?

  22. 22

    비 관리 코드로 전달하는 동안 ByRef가 예외를 제공하는 이유는 무엇입니까?

  23. 23

    약한 자체를 정적 함수의 클로저로 전달하는 것에서 유지주기가 발생하는 이유는 무엇입니까?

  24. 24

    "변수 만 참조로 전달해야합니다"오류가 발생하는 이유는 무엇입니까?

  25. 25

    여기에 참조로 포인터를 전달하면 오류가 발생하는 이유는 무엇입니까?

  26. 26

    벡터가 const 참조로 전달 되었는데도 값으로 전달 된 것처럼 처리되는 이유는 무엇입니까?

  27. 27

    참조로 전달하면 재귀 오류가 수정되는 이유는 무엇입니까?

  28. 28

    natty가 Firefox 베타 버전으로 업그레이드를 제안하는 이유는 무엇입니까?

  29. 29

    참조로 함수에 전달 된 변수가 값을 즉시 변경하지 않는 이유는 무엇입니까?

뜨겁다태그

보관