2012-12-17 2 views
27

C++ 11은 boost::intrusive_ptr과 같은 기능을합니까?intrusive_ptr in C++ 11

내 문제는 내 C++ 코드에 C 스타일 인터페이스가 있다는 것입니다. 인터페이스의 양면은 C++을 사용할 수 있지만 호환성을 위해 C 인터페이스가 필요합니다. std::shared_ptr 두 개 (또는 이상) 스마트 포인터를 통해 개체를 관리해야하기 때문에 사용할 수 없습니다. boost::intrusive_ptr과 같은 솔루션을 찾아 낼 수가 없습니다.

+0

사용자 정의 삭제자를 사용하여'unique_ptr' 주위의 래퍼를 사용하여 스레드 안전 (또는 비 참조) 참조 수를 만들 수 있도록'intrusive_ptr' 구현을 만들 수 있습니다. 주위를 돌아 다니기가 쉽지 않습니다 (이동 또는 수동으로 심판 수를 조작해야 함). 가능합니다. – Chad

답변

33

C++ 11에는 boost :: intrusive_ptr과 동일한 기능이 있습니까?

std::shared_ptr 수단 std::make_shared 인 있는가 거의 기준 카운트는 오브젝트 자체에 메모리에 인접하여 저장 될 수 있기 때문에, 관입 스마트 포인터만큼 효율적 (아래 참고 참조) 참조 및 캐시 사용의 지역성을 향상시킵니다. 또한 shared_ptr이 소유 한 개체에 대한 기본 제공 포인터 만있을 때 std::shared_ptr을 검색 할 수 있지만 다른 스마트 포인터 유형을 사용하여 개체를 관리 할 수는 없습니다. std::enable_shared_from_this을 제공합니다.

shared_ptr은 개체 관리를 전적으로 담당해야합니다. 다른 스마트 포인터 유형은 카운트가 동기화되지 않고 shared_ptr의 불변 값을 나눌 수있게하는 "약한"참조 횟수가 아닌 "강력한"조회 수만 관리 할 수 ​​있습니다.


참고 : make_shared 사용은 shared_ptr가 침입 포인터로 거의 효율적이 될 수 있습니다. make_shared이 사용될 때 객체 및 참조 카운팅 정보가 단일 메모리 덩어리에 할당 될 수 있지만 간섭 포인터에 해당하지 않는 두 개의 참조 카운트 ("strong"및 "weak"카운트의 경우)가 여전히 존재합니다 그들은 weak_ptr을 지원하지 않으므로 또한 shared_ptr 개체 자체는 항상 두 개의 포인터 (shared_ptr::get()에 의해 반환되는 포인터와 참조 카운트를 포함하고 소유 된 개체의 동적 유형을 아는 "제어 블록"에 대한 포인터)을 저장해야하므로 더 큰 공간을 차지합니다 침입 포인터보다.

+9

weak_ptr_을 지원하지 않는 _intrusive 포인터 - 명확한 설명 : 침입 포인터는 의도적으로 (스레드 세이프) weak_ptr을 지원할 수 없습니다. refcount는 객체 외부에 저장해야합니다. 그렇지 않으면 약 포인터의 잠금 시도가 객체의 파괴와 경쟁하게됩니다. 다른 말로하면 : 각각의 약 포인터는 refcount에 대한 소유권을 공유합니다. 따라서 refcounter가 객체 자체와 분리 할 수없는 경우 (침입 포인터의 경우와 마찬가지로) 약한 포인터는 객체 자체에 대한 소유권을 공유하므로 weak 포인터의 개념과 모순됩니다. – ComicSansMS

+1

@ComicSansMS, 참으로 - 그것은 내 부분에 대한 가난한 표현이었습니다. 나는 약간의 메모를 reworded했고, 나는 그것이 더 분명 해졌기를 바란다. 감사. –

+2

@ComicSansMS 스레드와 관련된 문제 만이 아닙니다 : 약한 포인터가 객체가 아직 살아 있는지 검사 할 수 없습니다. 이미 파괴 되었기 때문에'자유로운'메모리를 읽을 것입니다. – pqnet