Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::tr1::共享>;。这么贵?_C++_Visual Studio 2010_Shared Ptr_Tr1 - Fatal编程技术网

C++ 为什么std::tr1::共享>;。这么贵?

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测试

在分析一些大量使用共享\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测试{
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
无法或应该使用其引用计数;这将违反接口。