함수에 공유 포인터를 전달하고 싶습니다. 저를 도와 줄 수 있습니까?
물론입니다. 도와 드릴 수 있습니다. 나는 당신이 C ++의 소유권 의미에 대해 어느 정도 이해하고 있다고 가정합니다. 사실인가요?
예, 저는 주제에 대해 상당히 편안합니다.
좋은.
좋아, 나는 shared_ptr
논쟁을 해야하는 두 가지 이유만을 생각할 수있다 .
- 함수는 객체의 소유권을 공유하려고합니다.
- 이 함수는
shared_ptr
s에서 특별히 작동하는 일부 작업을 수행합니다 .
어떤 것에 관심이 있습니까?
나는 일반적인 대답을 찾고 있으므로 실제로 두 가지 모두에 관심이 있습니다. 그래도 케이스 # 2에서 당신이 의미하는 바가 궁금합니다.
이러한 함수의 예로는 std::static_pointer_cast
, 사용자 정의 비교기 또는 술어가 있습니다. 예를 들어 벡터에서 고유 한 shared_ptr을 모두 찾아야하는 경우 이러한 술어가 필요합니다.
아, 함수가 실제로 스마트 포인터 자체를 조작해야 할 때.
바로 그거죠.
그럴 때는 참고로 통과해야한다고 생각합니다.
예. 포인터를 변경하지 않으면 const 참조로 전달하고 싶습니다. 소유권을 공유 할 필요가 없기 때문에 복사 할 필요가 없습니다. 그것이 다른 시나리오입니다.
알겠습니다. 다른 시나리오에 대해 이야기합시다.
소유권을 공유하는 사람? 확인. 어떻게 소유권을 공유 shared_ptr
합니까?
그것을 복사함으로써.
그런 다음 함수는 shared_ptr
, 맞습니까?
명백하게. 그래서 나는 그것을 const에 대한 참조로 전달하고 지역 변수에 복사합니까?
아니, 그것은 비관적이다. 참조로 전달되면 함수는 수동으로 복사 할 수밖에 없습니다. 값으로 전달되면 컴파일러는 복사와 이동 중에서 최상의 선택을 선택하고 자동으로 수행합니다. 따라서 가치를 전달하십시오.
좋은 지적. " 속도를 원하십니까? 가치로 전달 "이라는 기사를 더 자주 기억해야합니다 .
shared_ptr
예를 들어 함수 가 멤버 변수에를 저장하면 어떻게 될까요? 중복 사본을 만들지 않습니까?
이 함수는 단순히 shared_ptr
인수를 저장소로 이동할 수 있습니다 . 이동은 shared_ptr
참조 횟수를 변경하지 않기 때문에 저렴합니다.
아, 좋은 생각이야.
하지만 세 번째 시나리오를 생각하고 있습니다.을 조작 shared_ptr
하거나 소유권을 공유 하지 않으려면 어떻게해야 합니까?
이 경우 기능과 shared_ptr
는 전혀 관련이 없습니다. pointee를 조작하려면 pointee를 가져 와서 호출자가 원하는 소유권 의미를 선택하도록합니다.
그리고 참조 또는 가치로 pointee를 취해야합니까?
일반적인 규칙이 적용됩니다. 스마트 포인터는 아무것도 변경하지 않습니다.
복사하려면 값으로 전달하고 복사를 피하려면 참조로 전달하십시오.
권리.
흠. 또 다른 시나리오를 잊은 것 같습니다. 소유권을 공유하고 싶지만 특정 조건에만 의존하는 경우 어떻게합니까?
아, 흥미로운 엣지 케이스. 나는 그것이 자주 일어날 것이라고 기대하지 않습니다. 그러나 그것이 발생하면 값으로 전달하고 필요하지 않으면 사본을 무시하거나 참조로 전달하고 필요한 경우 사본을 만들 수 있습니다.
첫 번째 옵션에서 중복 사본 하나를 위험에 빠뜨리고 두 번째 옵션에서는 잠재적 인 이동을 잃습니다. 케이크도 먹어도 안 돼요?
이것이 정말로 중요한 상황에 있다면 두 개의 오버로드를 제공 할 수 있습니다. 하나는 const lvalue 참조를 사용하고 다른 하나는 rvalue 참조를 사용합니다. 하나는 복사하고 다른 하나는 움직입니다. 완벽한 전달 기능 템플릿은 또 다른 옵션입니다.
가능한 모든 시나리오를 포함한다고 생각합니다. 대단히 감사합니다.
const std::shared_ptr<myClass>& arg1