1. ホーム
  2. c++

[解決済み] なぜstd::shared_ptrをstd::moveしなければならないのでしょうか?

2022-04-20 02:08:43

質問

を見てきました。 Clang ソースコード で、こんなスニペットを見つけました。

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 参照カウントは アトミック .参照カウントの増加または減少 が必要です。 アトミック インクリメントまたはデクリメント . これは、100回 より遅い よりも 非アトミック インクリメント/デクリメントを行う場合、同じカウンターをインクリメント/デクリメントすると、正確な数値が得られ、その過程で膨大な時間とリソースを浪費することは言うまでもありません。

を移動させることで shared_ptr をコピーするのではなく、quot;steal" しています。 アトミック の参照カウントを無効化し、他の shared_ptr . "参照カウントを盗む"ではない アトミック をコピーするよりも何百倍も速いです。 shared_ptr (そして アトミック 参照インクリメントまたはデクリメント)。

このテクニックは、純粋に最適化のために使用されていることに注意してください。