4

分析一些大量使用 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(),我发现它创建了一个新的引用计数对象。

有没有更便宜的方法,可以重用现有的引用计数并且不打扰堆?

4

1 回答 1

4

在一般情况下,您不能重用现有的 ref 计数,因为可能有其他shared_ptrs 或weak_ptrs 使用它。

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

于 2010-06-15T13:13:28.750 回答