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