Почему std :: tr1 :: shared_ptr <>. Reset () так дорого стоит? - PullRequest
4 голосов
/ 15 июня 2010

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

Например:

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

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

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

1 Ответ

4 голосов
/ 15 июня 2010

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

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

...