为什么std :: tr1 :: shared_ptr<> .reset()这么贵?

时间:2010-06-15 13:11:15

标签: c++ visual-studio-2010 shared-ptr tr1

分析一些大量使用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);

在最后一行(在VC ++ 2010下)跟踪reset(),我发现它创建了一个新的引用计数对象。

是否有更便宜的方法,重用现有的ref-count而不打扰堆?

1 个答案:

答案 0 :(得分:4)

在一般情况下,您无法重复使用现有的引用计数,因为可能有其他shared_ptrweak_ptr使用它。

如果您可以使用somePointerToATestObject创建make_shared(),那么实现可能对引用计数和对象使用单个堆分配。这将为您节省一个堆分配。