gpt4 book ai didi

c++ - 转让独家所有权 : unique_ptr vs move semantics

转载 作者:太空狗 更新时间:2023-10-29 21:19:41 27 4
gpt4 key购买 nike

似乎 std::unique_ptr 解决了一个也可以用 move 语义解决的问题,即转移唯一拥有的资源的所有权。以下是他们似乎执行相同工作的一些示例:

class SomeResource { /* resourcey stuff */ };

void ProcessResourcePtr(std::unique_ptr<SomeResource> r) { /* do stuff */ }
void ProcessResourceRvalRef(SomeResource&& r) { /* do stuff */ }

class OwnerOfResourcePtr {
private:
std::unique_ptr<SomeResource> r_;
public:
OwnerOfResourcePtr(std::unique_ptr<SomeResource> r) : r_(std::move(r)) { }
};

class OwnerOfResourceRvalRef {
private:
SomeResource r_;
public:
OwnerOfResourceRvalRef(SomeResource&& r) : r_(std::move(r)) { }
};


int main()
{
// transfer ownership to function via unique_ptr
std::unique_ptr<SomeResource> r1(new SomeResource());
ProcessResourcePtr(std::move(r1));

// transfer ownership to function via rvalue ref
SomeResource r2;
ProcessResourceRvalRef(std::move(r2));

// transfer ownership to instance via unique_ptr
std::unique_ptr<SomeResource> r3(new SomeResource());
OwnerOfResourcePtr(std::move(r3));

// transfer ownership to instance via rvalue ref
SomeResource r4;
OwnerOfResourceRvalRef(std::move(r4));

return 0;
}

在我看来,它们都以略有不同的方式解决了几乎完全相同的问题。我不是 100% 清楚一种方式相对于另一种方式的优势。我知道指针 move 可能比 move 构造函数/赋值更快,尽管通常认为两者都非常有效。我还知道 move 语义允许您将数据保存在堆栈上(参见 r2、r4),而不是需要使用 new/malloc/etc 进行堆分配/解除分配(参见 r1、r3),我认为这是一个很好的方法事情(是吗?)。

一般来说,什么时候应该更喜欢 unique_ptr 而不是 move 语义,反之亦然?是否存在只能由一个或另一个解决的用例?

最佳答案

如果您有一个类(可能是由其他人编写的)没有 move 构造函数,甚至可能没有复制构造函数,那么您可能不得不使用 unique_ptr

如果一个实例是可选的,即可能不存在,您应该使用 unique_ptr

如果只能在调用构造函数后初始化对象,并且该对象不可默认构造,则必须延迟构造,为此可以使用unique_ptr

即使一个类有 move 构造函数,这也可能比 move 单个指针更昂贵。例如,如果该类包含数十个 POD 实例或一个数组。

关于c++ - 转让独家所有权 : unique_ptr vs move semantics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com