首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我要移动一个std::shared_ptr?

为什么我要移动一个std::shared_ptr?
EN

Stack Overflow用户
提问于 2017-01-26 18:11:36
回答 4查看 61.2K关注 0票数 174

我一直在查找Clang source code,发现了以下代码片段:

代码语言:javascript
复制
void CompilerInstance::setInvocation(
    std::shared_ptr<CompilerInvocation> Value) {
  Invocation = std::move(Value);
}

为什么我要对std::shared_ptr执行std::move操作?

转移共享资源的所有权有什么意义吗?

为什么我不直接这么做呢?

代码语言:javascript
复制
void CompilerInstance::setInvocation(
    std::shared_ptr<CompilerInvocation> Value) {
  Invocation = Value;
}
EN

回答 4

Stack Overflow用户

发布于 2017-01-26 18:14:31

通过使用move,您可以避免增加然后立即减少共享数量。这可能会在使用计数上为您节省一些昂贵的原子操作。

票数 135
EN

Stack Overflow用户

发布于 2017-01-26 18:15:06

复制shared_ptr涉及复制其内部状态对象指针和更改引用计数。移动它只需要交换指向内部引用计数器和拥有的对象的指针,所以速度更快。

票数 23
EN

Stack Overflow用户

发布于 2017-01-27 02:53:53

在这种情况下使用std::move有两个原因。大多数回复都解决了速度问题,但忽略了更清楚地显示代码意图的重要问题。

对于std::shared_ptr,std::move明确地表示被指针对象的所有权转移,而简单的复制操作则添加了一个额外的所有者。当然,如果最初的所有者随后放弃了他们的所有权(例如通过允许销毁他们的std::shared_ptr ),那么所有权转移就完成了。

当您使用std::move转移所有权时,所发生的事情是显而易见的。如果您使用普通副本,那么在您验证原始所有者是否立即放弃所有权之前,并不明显预期的操作是转移。作为额外的好处,更有效的实现是可能的,因为所有权的原子转移可以避免所有者数量增加1的临时状态(以及随之而来的引用计数的变化)。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41871115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档