2010-05-25 2 views
7

boost::intrusive_ptrintrusive_ptr_add_refintrusive_ptr_release을 정의해야합니다. 기본 클래스가 제공되지 않는 이유는 무엇입니까? 여기에 예제가 있습니다 : http://lists.boost.org/Archives/boost/2004/06/66957.php 포스터는 "나는 이것이 반드시 좋은 생각이라고 생각하지 않습니다."라고 말합니다. 왜 안돼?intrusive_ptr : 공통 기본 클래스가 제공되지 않는 이유는 무엇입니까?

업데이트 :이 클래스가 다중 상속으로 잘못 사용될 수 있다고 생각하지 않습니다. 참조 횟수가 여러 개인 기본 클래스에서 파생되는 모든 클래스에는 동일한 문제가 있습니다. 이러한 refcount가 기본 클래스를 통해 구현되는지 여부는 아무런 차이가 없습니다.

멀티 스레딩에 문제가 있다고 생각하지 않습니다. boost::shared_ptr은 원자 참조 카운팅을 제공하며이 클래스도 가능합니다.

+3

는 최상위 공통 기본 클래스를 (사용 'osg :: Referenced')를 삽입하여 스마트 포인터를 구현합니다. –

+3

osg :: Referenced는 intrusive_ptr_add_ref() 및 intrusive_ptr_release() 함수를 제공하므로 boost :: intrusive_ptr과 호환됩니다. 완벽하게 작동합니다. –

답변

2

부스트는이를위한 기능을 제공합니다. 그것은 두 스레드 안전 또는 스레드 안전하지 않은 refcount로 구성 할 수 있습니다 :

#include <boost/intrusive_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ref_counter.hpp> 

class CMyClass 
    : public boost::intrusive_ref_counter< 
           CMyClass, 
           boost::thread_unsafe_counter> 
    ... 

boost::intrusive_ptr<CMyClass> myPtr; 
관련 메모,`OpenSceneGraph 라이브러리에서 OSG :: ref_ptr`에

http://www.boost.org/doc/libs/1_62_0/libs/smart_ptr/intrusive_ref_counter.html

+0

다른 말로하면 내 질문에 대한 대답은 "있어야하고 지금은 있습니다"입니다. – Jon

+0

잠시 동안 거기에 있었던 것처럼 보이지만 조금 돌아 다녔습니다. 다음은 내가 찾은 가장 오래된 문서 참조입니다. http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/utilities.html#header.boost.log.utility.intrusive_ref_counter_hpp –

3

문제는 다중 상속과 관련이 있습니다. 이 기본을 구현하는 2 개의 개체를 상속하면 단일 개체에 대해 2 개의 카운터가 생겨 혼란을 야기 할 수 있습니다.

그러므로 ptr_addptr_release 메소드를 가상으로 만들어야 파생 클래스가 여러 카운터를 한 번에 적절히 동기화하기위한 재정의를 구현할 수 있습니다. 특히 성능상의 불이익은 결국 다중 상속에만 유용하기 때문에 완전히 불필요합니다 (무시하지 않을 것임).

물론 멀티 스레드 환경에서 (단시간 동안) 비 동기화 된 카운터를 가질 수 있습니다 (첫 번째 카운터는 증가했지만 두 번째 카운터 전에는 스레드가 중단되었습니다). 문제는 아직 생각할 수 없습니다. 원인,하지만 그것은 제정신이 아닙니다.

클래스에 혼란을 추가 할 수도 있습니다. 일부 클라이언트는 모두 (스택에 객체를 만드는 경우) 참조 계산이 필요하지 않을 수 있습니다. 나는 그것이 좋은 생각이 아니다라고 생각

)

+2

다중 상속 :이 문제는 자체 참조 횟수를 구현하는 두 개의 기본 클래스가있는 경우에도 발생합니다. 이 refcount가 기본 클래스를 통해 구현되는지 여부는 아무런 차이가 없습니다. 다중 스레드 : shared_ptr에는 원자 단위의 증분/감소가 있으므로이 클래스도 가능합니다. "일부 클라이언트는 참조 카운팅이 필요하지 않을 수 있습니다": 이유는 기본 클래스가없는 이유가 아니라 intrusive_ptr을 사용하지 않는 이유입니다. – Jon

+1

@ 존 : 다중 상속에 동의합니다. 참으로 기본 클래스없이 간섭 적 참조 계산을 구현할 수 있습니다. 그러나 나는 2 개의 다른 발언에 동의하지 않는다 : MT'shared_ptr'는 하나의 카운터만을 가지고 있기 때문에 원자 의미론을 쉽게 제공한다. 일관된 상태로 유지할 여러 카운터가 있다면 명시 적 잠금이 필요하다 (더 이상 atomic op가 없다). 이것은 결과적인 간접비를 의미합니다 ... 흰 토끼를 따르십시오 ... –

+1

'intrusive_ptr' 부분은 : 저는 여기 부분적입니다.하지만 나는 항상 "기능적"클래스와 "관리"행동을 번들로 묶어 놓은 방식으로 침입 접근 방식이 "잘못"이라고 생각했습니다. 따라서 이것은 간섭 적 참조 계산 메커니즘에 대한 비판입니다. 나는 여기서'shared_ptr' 접근법이 더 견고하다는 것을 알았습니다. 실수로'shared_ptr'의 단일 세트에 대해 두 개의 카운터를 가질 수 없다는 사실은 좋은 보너스입니다. –

4

그것은 그래서 당신은 이미 추가 릴리스 구현하는 클래스와 intrusive_ptr 사용할 수 있습니다.

+0

intrusive_ptr (메모리 풋 프린트, 성능, 임의의 원시 포인터에서 생성)을 사용하는 다른 이유가 있습니다 – Jon

+0

IMHO –

관련 문제