C++ 为什么std::tr1::共享>;。这么贵?
在分析一些大量使用共享\u ptr的代码时,我发现reset()非常昂贵 例如:C++ 为什么std::tr1::共享>;。这么贵?,c++,visual-studio-2010,shared-ptr,tr1,C++,Visual Studio 2010,Shared Ptr,Tr1,在分析一些大量使用共享\u 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); struct测试
struct Test {
int i;
Test() {
this->i = 0;
}
Test(int i) {
this->i = i;
}
} ;
...
auto t = make_shared<Test>(1);
...
t.reset(somePointerToATestObject);
struct测试{
int i;
测试(){
这个->i=0;
}
测试(int i){
这个->i=i;
}
} ;
...
自动t=使_共享(1);
...
t、 重置(SomePointerToatesObject);
跟踪最后一行(在VC++2010下)中的reset(),我发现它创建了一个新的引用计数对象
有没有一种更便宜的方法,可以重用现有的ref计数而不影响堆 在一般情况下,您不能重用现有的ref计数,因为可能有其他
共享的ptr
s或弱的ptr
s使用它
如果可以使用
make_shared()
创建somepointerToatesObject
,则实现可能会对ref计数和对象使用单个堆分配。这将为您节省一个堆分配。只是想知道,您为什么要共享1
的任意指针值?@ian:他不是。你知道“让你共享”是什么吗?什么类型的somePointerToATestObject
。这和qt的qsharedpointer是一样的,对吧?算了吧。shared_ptr reset不是您的瓶颈,也永远不会成为瓶颈。遗憾的是,reset()没有一个版本可以将shared_ptr作为parameters@Paul:对;您只需将其指定为t=otherSharedPtr
。我不明白这个答案tr1::shared_ptr
(与boost::shared_ptr
不同)没有需要另一个shared_ptr
的reset
重载。每次调用reset
都必须创建一个引用计数以绑定到提供的指针,因为即使提供的指针当前由另一个shared\u ptr
所有,也无法(enable\u shared\u from\u this
不是要求)获取任何现有引用计数。如果提供的指针属于另一个智能指针(shared_ptr
或其他),那么使用reset
并“告诉”shared_ptr
它拥有所有权肯定是程序员的错误?@Charles:对。正如我在评论中所说,我们应该简单地使用赋值。我在回答中试图说的是,当创建somepointerToatesObject
时,应该立即将其分配给共享的\u ptr
。这样,您就不必担心如何使用reset()
。我不知道我是否理解你不同意的部分:-/。你的第一句话让我困惑。如果somePointerToATestObject
被传递到reset
,那么它只能是一个原始指针,所以我不知道“现有引用计数”从何而来。原始指针(不一定)与现有引用计数关联。如果原始指针实际上来自另一个共享的\u ptr
,那么这是一个彻头彻尾的程序员错误。reset
无法或应该使用其引用计数;这将违反接口。