2016-11-02 5 views
2

대 unique_ptr + 이동의 우리가 이런 식으로 뭔가가 있다고 가정하자 :생성자 의존성 주입 : shared_ptr의

struct Complex{ 
    Complex(Part1 p1, Part2 p2, Part3 p3) 
} 

Part1 p1; 
Part2 p2; 
Part3 p3; 

그러나 통과 사본이 효과적이지를, 그래서 우리는 포인터로 이동해야합니다. 질문은, unique_ptr 더 나은 것 같다 Complexp1, p2, p3의 실제 소유자이기 때문에, 언뜻보기 — unique_ptr 또는 shared_ptr

를 사용하는 유형이다; 그러나 복사 할 수 없으므로 std::move을 사용해야합니다.

그래서 제 질문은 Partunqiue_ptr을 만든 다음 Complex의 생성자에서 move를 사용하거나 beggining에서 shared_ptr을 만드는 대신 shared_ptr를 사용,이 경우에 대한 더 좋은 방법이 무엇인지 —입니까?

+0

* 통과하는 사본은 효과적이지 않으므로 포인터 *.로 이동해야합니다. 그렇지 않으면 컴플렉스 및 파트를 이동 가능하게 만드십니까? – stijn

+0

복합체 - 단지 복잡하고 긴 생명체입니다. 그러나 현재로서는 "규칙 5"를 구현할 계획이 없습니다. –

+2

또한 문제의 해결책이 아닌가? 어쨌든 : 스마트 포인터는 어떤 종류의 소유권을 나타냅니다. 따라서 대답은 쉬운 것처럼 보입니다 : p1/p2/p3이 * 공유 *되지 않으면 * shared * _ptr을 사용하지 마십시오? – stijn

답변

9

가장 좋은 해결책은 Part 유형을 저렴하게 이동하고 이동하는 것입니다. 그러나 옵션이 아닌 경우 동적으로 관리해야합니다.

여러분이 말한 것처럼 Complex은 부품을 소유하므로 std::uniqe_ptr<Part>으로 받아 들여야하며이 포인터를 자체로 이동해야합니다. std::unique_ptr을 이동하는 것은 저렴합니다. 포인터 할당이 두 개인 경우가 많습니다. std::shared_ptr 및 (원래의 파괴를 위해) 및 감소 (사본을 생성하기위한) 불필요한 원자 증가를 포함하여 복사 한편

. 오늘날의 캐시가 무거운 멀티 코어 프로세서의 경우 원자 작업은 저렴한 가격으로 제공됩니다.

따라서 코드의 의도 된 의미 (고유 한 소유권은 관용적으로 std::unique_ptr으로 표현됨)를 준수하면 좋은 성능을 보너스로 얻을 수 있습니다.

+0

두 포인터 할당이 아닌 이유는 무엇입니까? – GeorgeAl

+1

@GeorgeAl 대상을 가리키는 대상 하나, 원본을 null로 가리키는 대상입니다. 그렇지 않으면, 소스의 소멸자는 그것이 비어 있음을 알지 못하며, 지적자를 할당 해제합니다. – Angew