分析一些大量使用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而不打扰堆?
答案 0 :(得分:4)
在一般情况下,您无法重复使用现有的引用计数,因为可能有其他shared_ptr
或weak_ptr
使用它。
如果您可以使用somePointerToATestObject
创建make_shared()
,那么实现可能对引用计数和对象使用单个堆分配。这将为您节省一个堆分配。