2009-06-05 3 views
5

shared_ptr 내부를 인식하고 내부 weak 포인터를 복사하기 위해 저장된 shared_ptr 요소를 정기적으로 복사하지 않는 콜렉션이 있습니까?shared_ptr 전용 컬렉션

이것은 생성자/소멸자 호출이 수행되지 않으며 shared_ptrs의 참조 카운터를 조작하지 않는다는 것을 암시 적으로 의미합니다. 거기 귀하의 질문에 대답해야 shared_ptr의 내부의 인식

답변

3

,

. 내부에 대해 알기 위해서는 그러한 콜렉션이 부스트의 스마트 포인터 라이브러리의 일부가되어야합니다. 불행히도 그런 것은 없습니다.

이것은 실제로 스마트 포인터의 단점입니다. 내부적으로 수행되는 복사본의 수를 제한하는 데이터 구조를 사용하는 것이 좋습니다. 벡터의 재 할당은 고통 스러울 것이다. 아마도 청크 기반 할당을 사용하는 deque가 유용 할 것입니다. 벡터 구현은 새로운 메모리를 기하 급수적으로 증가시키는 경향이 있다는 것을 명심하십시오. 그래서 그들은 10 가지 요소를 재 할당하지 않습니다. 대신 128 개의 요소로 시작할 수 있습니다. 벡터는 자체적으로 256을 예약 한 다음 512, 1024 등으로 이동합니다. 필요한 때마다 두 배가됩니다.

부스트의 ptr_vector가 부족하거나 내부 복사본을 방지하기에 충분한 공간이있는 데이터 구조를 미리 할당해야합니다.

9

이론적으로 C++ 0x를 채택한 후에 적절한 경우 이동 의미를 사용하도록 컨테이너가 수정됩니다. 이 시점에서 shared_ptr은 불필요한 참조 횟수 조정을 최소화하기 위해 이동 생성자를 갖도록 수정할 수 있습니다.

+2

C++ 0x 초안에서 shared_ptr에 이미이 동작이 있습니다. –

+0

그럼 당신은 간다! :) – MSN