我一直在查看Clang 源代码,发现了这个片段:
void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); }
我为什么要std::move一个std::shared_ptr?
std::move
std::shared_ptr
转移共享资源的所有权有什么意义吗?
我为什么不这样做呢?
void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }
我认为其他答案没有足够强调的一件事是 速度 。
std::shared_ptr引用计数是 原子 的。增加或减少引用计数 需要 原子 增量或减量。这比 非原子递增/递减 慢 了一百倍,更不用说如果我们递增和递减同一个计数器,我们最终会得到准确的数字,在这个过程中浪费了大量的时间和资源。 __
通过移动shared_ptr而不是复制它,我们“窃取”了 原子 引用计数,并使另一个无效shared_ptr。“窃取”引用计数不是 原子shared_ptr的,它比复制(并导致 原子 引用递增或递减)快一百倍。
shared_ptr
请注意,此技术纯粹用于优化。复制它(如您所建议的)在功能方面同样出色。