我一直在查找Clang source code,发现了以下代码片段:
void CompilerInstance::setInvocation(
std::shared_ptr<CompilerInvocation> Value) {
Invocation = std::move(Value);
}
为什么我要对std::shared_ptr
执行std::move
操作?
转移共享资源的所有权有什么意义吗?
为什么我不直接这么做呢?
void CompilerInstance::setInvocation(
std::shared_ptr<CompilerInvocation> Value) {
Invocation = Value;
}
发布于 2017-01-26 18:14:31
通过使用move
,您可以避免增加然后立即减少共享数量。这可能会在使用计数上为您节省一些昂贵的原子操作。
发布于 2017-01-26 18:15:06
复制shared_ptr
涉及复制其内部状态对象指针和更改引用计数。移动它只需要交换指向内部引用计数器和拥有的对象的指针,所以速度更快。
发布于 2017-01-27 02:53:53
在这种情况下使用std::move有两个原因。大多数回复都解决了速度问题,但忽略了更清楚地显示代码意图的重要问题。
对于std::shared_ptr,std::move明确地表示被指针对象的所有权转移,而简单的复制操作则添加了一个额外的所有者。当然,如果最初的所有者随后放弃了他们的所有权(例如通过允许销毁他们的std::shared_ptr ),那么所有权转移就完成了。
当您使用std::move转移所有权时,所发生的事情是显而易见的。如果您使用普通副本,那么在您验证原始所有者是否立即放弃所有权之前,并不明显预期的操作是转移。作为额外的好处,更有效的实现是可能的,因为所有权的原子转移可以避免所有者数量增加1的临时状态(以及随之而来的引用计数的变化)。
https://stackoverflow.com/questions/41871115
复制相似问题