【さんしょうカウント】

参照カウント とは?

最終更新:
💡 保持する参照の数を見て、片付ける

オブジェクトを保持する参照を数え、不要になったオブジェクトを解放するメモリ管理の方式。増減の例、循環参照、CPythonの補助GCとSwiftの弱参照を説明します。

📌 このページのポイント
参照カウント:保持する参照を数える他に強い参照がない単純な例A・B2Bだけ1参照なし0Aを手放すBを手放す循環参照:互いを保持したままX:参照数1Y:参照数1単純な方式だけでは0にならない弱参照や補助のGCも使うよ
上段の数字は同じオブジェクトへの強い参照数。下段は外部の参照を手放しても互いの強い参照が残る例です。
ひよこ ひよこ
参照カウントは、何を数えるの?
ペンギン先生 ペンギン先生
そのオブジェクトを保持する強い参照の数だよ。参照する変数だけでなく、他のオブジェクトが持つ参照も対象になる。弱い参照は、相手を生存させる強い参照とは分けて考えるんだ。
ひよこ ひよこ
AとBが同じものを使うと、いくつ?
ペンギン先生 ペンギン先生
他に強い参照がない単純な例なら、Aだけで1、Bも参照するとさらに1増えて合計2だよ。Aが手放すと1、Bも手放すと0になる。単純な方式では、最後の強い参照がなくなったオブジェクトを解放するんだ。
ひよこ ひよこ
AとBがお互いを参照したら?
ペンギン先生 ペンギン先生
外から使う参照がなくなっても、互いを保持する強い参照が残ると数が0にならないよ。これが循環参照。単純な参照カウントだけでは回収できないので、仕組みや参照の持ち方を工夫する必要があるんだ。
ひよこ ひよこ
PythonやSwiftでは、どうするの?
ペンギン先生 ペンギン先生
CPythonは参照カウントを、循環参照を扱うGCで補うよ。SwiftのARCでは、必要な関係にweakなどを使って強い参照の循環を避ける。解放のタイミングや最適化は実装で違うので、全言語で同じ動作と考えないようにしよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「参照カウント」って出てきたら「保持する参照の数を数えて、不要なオブジェクトを片付ける方式」と思えばだいたいOK!
📖 おまけ:英語の意味
「Reference Counting」 = 参照を数える
💬 「reference(参照)」を「counting(数える)」という、その名の通りのシンプルな仕組みだよ

参考資料

← 用語集にもどる