shared_ptr이 하나만 사용하는 경우 unique_ptr이 두 개의 템플릿 매개 변수를 사용하는 이유는 무엇입니까?
모두 unique_ptr와 shared_ptr자신이 소유 한 객체를 호출하는 사용자 정의 소멸자에 동의합니다. 그러나의 경우 unique_ptr소멸자는 클래스 의 템플릿 매개 변수로 전달되는 반면 shared_ptr사용자 지정 소멸자 의 유형은 생성자 의 템플릿 매개 변수로 지정됩니다 .
template <class T, class D = default_delete<T>>
class unique_ptr
{
unique_ptr(T*, D&); //simplified
...
};
과
template<class T>
class shared_ptr
{
template<typename D>
shared_ptr(T*, D); //simplified
...
};
왜 그런 차이가 있는지 모르겠습니다. 무엇이 필요합니까?
deleter를 템플릿 인수로 제공하면 (에서와 같이 unique_ptr) 유형의 일부 이며이 유형의 객체에 추가로 저장할 필요가 없습니다. deleter가 생성자의 인수로 전달되면 (에서와 같이 shared_ptr) 객체에 저장해야합니다. 동일한 유형의 개체에 대해 다른 삭제자를 사용할 수 있기 때문에 유연성이 추가됩니다.
나는 이것이 이유라고 생각한다 : unique_ptr은 오버 헤드가 전혀없는 매우 가벼운 객체 여야한다. 삭제자를 각각 저장하면 unique_ptr크기가 두 배가 될 수 있습니다. 그 때문에 사람들은 좋은 오래된 원시 포인터를 대신 사용할 것입니다.
반면에, shared_ptr참조 횟수를 저장해야하기 때문에 그다지 가볍지 않으므로 사용자 지정 삭제자를 저장하는 것도 좋은 절충안처럼 보입니다.
다른 유형 의 공유 포인터 는 동일한 개체 의 소유권을 공유 할 수 있습니다 . 의 과부하 (8) 를 참조하십시오 std::shared_ptr::shared_ptr. 고유 포인터는 공유하지 않으므로 이러한 메커니즘이 필요 하지 않습니다 .
template< class Y >
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;
당신이 Deleter가 입력-삭제하지 않은 경우, 당신은 이러한을 사용할 수있게되지 않을 것 shared_ptr<T, Y_Deleter>A와 shared_ptr<T>는 기본적으로 쓸모 만들 것이다.
왜 그런 과부하를 원하십니까?
중히 여기다
struct Member {};
struct Container { Member member };
Container를 사용하는 동안 살아있는 상태로 유지하려면 Member다음을 수행 할 수 있습니다.
std::shared_ptr<Container> pContainer = /* something */
std::shared_ptr<Member> pMember(pContainer, &pContainer->member);
만 지키고있는 pMember(아마도에 넣어 std::vector<std::shared_ptr<Member>>)
또는 과부하 사용 (9)
template< class Y >
shared_ptr( const shared_ptr<Y>& r ) noexcept;
// Only exists if Y* is implicitly convertible to T*
다형성 공유를 할 수 있습니다
struct Base {};
struct Derived : Base {};
void operate_on_base(std::shared_ptr<Base>);
std::shared_ptr<Derived> pDerived = /* something*/
operate_on_base(pDerived);
'Program Club' 카테고리의 다른 글
| Scala의 @inline 주석이 실제로 성능에 도움이됩니까? (0) | 2020.11.28 |
|---|---|
| CORS 및 Access-Control-Allow-Headers는 어떻게 작동합니까? (0) | 2020.11.28 |
| rxJS의 파이프는 무엇입니까? (0) | 2020.11.28 |
| 왜 JPG가 아닌 PNG를 사용해야합니까? (0) | 2020.11.28 |
| "Illegal Instruction : 4"오류는 무엇이며 "-mmacosx-version-min = 10.x"로 해결되는 이유는 무엇입니까? (0) | 2020.11.28 |