2010-06-15 6 views
4

Профилирование кода, который сильно использует shared_ptrs, я обнаружил, что reset() был неожиданно дорогим.Почему std :: tr1 :: shared_ptr <>. Reset() так дорого?

Например:

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

Трассировка сброс() в последней строке (под VC++ 2010), я обнаружил, что она создает новый объект подсчета ссылок.

Есть ли более дешевый способ, который повторно использует существующий счетчик ссылок и не беспокоит кучу?

+0

просто интересно, почему вы делитесь произвольным значением указателя '1'? – ianmac45

+3

@ian: Это не так. Знаете ли вы, что делает 'make_shared'? – fredoverflow

+0

Какой тип 'somePointerToATestObject'? –

ответ

4

В общем случае вы не можете повторно использовать существующий счетчик ссылок, потому что он может использовать другие shared_ptr s или weak_ptr s.

Если вы можете создать somePointerToATestObject с помощью make_shared(), то реализация может использовать одно выделение динамической памяти для обоих подсчетов реф и объекта. Это сэкономит вам одно из распределений кучи.

+0

К сожалению, reset() не имеет версии, которая получает shared_ptr <> как параметры –

+4

@Paul: Right; вы просто назначаете его как в 't = otherSharedPtr'. –

+0

Я не понимаю этого ответа. 'tr1 :: shared_ptr' (в отличие от' boost :: shared_ptr') не имеет перегрузки 'reset', которая принимает еще один' shared_ptr'. Каждый вызов 'reset' должен создавать счетчик ссылок для привязки к указанному указателю, потому что нет способа (' enable_shared_from_this' не является обязательным требованием), чтобы получить любой существующий счетчик ссылок, даже если поставляемый указатель в настоящее время принадлежит другому ' shared_ptr'. Если поставляемый указатель принадлежит другому интеллектуальному указателю ('shared_ptr' или иначе), то это ошибка программиста, чтобы использовать' reset' и «tell» 'shared_ptr', что у него есть право собственности? –