2010-06-15 3 views
4

shared_ptrs를 많이 사용하는 일부 코드의 프로파일 링에서 reset()이 놀랍게 비용이 많이 든다는 것을 발견했습니다. 예를 들어std :: tr1 :: shared_ptr <>. reset()이 왜 그렇게 비쌉니까?

: (VC++ 2010에서) 마지막 줄에있는 리셋()를 추적

struct Test { 
    int i; 
    Test() { 
     this->i = 0; 
    } 
    Test(int i) { 
     this->i = i; 
    } 
} ; 
... 
auto t = make_shared<Test>(1); 
... 
t.reset(somePointerToATestObject); 

, 나는 그것이 새로운 참조 카운팅 객체를 생성 것을 발견했다.

기존의 심판 계수를 재사용하고 힙을 귀찮게하지 않으면 서 저렴한 방법이 있습니까?

+0

궁금한 점이 있다면 왜 '1'의 임의 포인터 값을 공유하고 있습니까? – ianmac45

+3

@ian : 그는 그렇지 않습니다. 'make_shared'가 무엇을하는지 알고 있습니까? – fredoverflow

+0

'somePointerToATestObject' 유형은 무엇입니까? –

답변

4

일반적으로 ref 카운터를 사용하면 shared_ptr 또는 weak_ptr이있을 수 있으므로 기존의 참조 횟수를 다시 사용할 수 없습니다. 당신이 make_shared()를 사용 somePointerToATestObject을 만들 수 있다면

는 다음 구현 심판의 수와 객체 모두에 대해 하나의 힙 할당을 사용할 수 있습니다. 그러면 힙 할당 중 하나가 저장됩니다.

+0

아쉽게도 reset()에는 shared_ptr <>을 매개 변수로 사용하는 버전이 없습니다. –

+4

@Paul : Right; 단순히't = otherSharedPtr'와 같이 할당하면됩니다. –

+0

이 답변을 이해할 수 없습니다. 'tr1 :: shared_ptr' ('boost :: shared_ptr'와는 달리)은 또 다른'shared_ptr'을 필요로하는'reset' 오버로드를 가지고 있지 않습니다. 'reset'을 호출 할 때마다 제공된 포인터가 현재 다른 포인터에 의해 소유되어 있어도 기존의 참조 카운트를 얻는 방법이 없기 때문에 ('enable_shared_from_this'는 요구 사항이 아니기 때문에) 제공된 포인터에 바인드 할 참조 카운트를 생성해야합니다. shared_ptr'. 만약 제공된 포인터가 다른 스마트 포인터 ('shared_ptr' 또는 다른 것)에 의해 소유된다면, 프로그래머는'reset'을 사용하고'shared_ptr'에게 소유권을 가지고 있다는 것을 알리는 것이 틀림 없습니까? –

관련 문제