私はプログラミング言語設計のコースを受講しており、トピックの 1 つはガベージ コレクションです。RC は GC に使用できるが、他の用途もあり、一部の言語では RC を実装しているが GC を実装していないことを資料から理解しました。
GC を使用しない場合、RC の使用は正確には何ですか?
( RC - 参照カウント。GC - ガベージ コレクション)
私はプログラミング言語設計のコースを受講しており、トピックの 1 つはガベージ コレクションです。RC は GC に使用できるが、他の用途もあり、一部の言語では RC を実装しているが GC を実装していないことを資料から理解しました。
GC を使用しない場合、RC の使用は正確には何ですか?
( RC - 参照カウント。GC - ガベージ コレクション)
参照カウントは、たとえば、参照されていないファイル ハンドルを閉じたり、現在参照されていないデータ (将来、間接パスを介して再参照される可能性がある) を何らかの方法で "アーカイブ" するために使用できます。
ガベージコレクションとは独立して使用される参照カウントの具体例を提供できます。Objective-Cは、ほとんどの場合、ガベージコレクターが存在しない状態で、参照カウントを使用してオブジェクトの存続期間を管理します。
これは、オブジェクトへの呼び出しとオブジェクトの処理時のバランスの取れた呼び出しによって行われ-retain
ます-release
。基本的に、オブジェクトは保持カウント1で作成され、オブジェクトへの参照を保持する必要があるすべてのオブジェクトは、最初に渡されたときに保持カウントを1増やし、完了したら保持カウントを1減らします。それ。オブジェクトの保持カウントを0に落とす最後の-release
呼び出し(もう誰もそれを必要としないはずです)は、オブジェクトタイプの内部メカニズムがそれ自体の割り当てを解除するようにトリガーします。
これを行うためにガベージコレクタープロセスは必要ありません。実際、Appleのプラットフォーム(Objective-Cの最大のユーザーである)には、ごく最近までこのガベージコレクターはありませんでした。これは、iOSモバイルデバイスでも使用されていません(現在、Macでは非推奨になっています)。デスクトップ)。
Objective-Cでの参照カウントは、デフォルトでは手動で行われるため、開発者は特定の規則に従って、リークや時期尚早の割り当て解除を回避するために、保持呼び出しと解放呼び出しのバランスを安全に保つ必要があります。これを自動化し、コンパイル時に適切な呼び出しを追加する新しいシステムがLLVMコンパイラ内に実装されました。この自動参照カウントにより、オブジェクトグラフをスイープするためのガベージコレクタープロセスの必要性を排除しながら、メモリを管理する手間が大幅に削減されます。
ガベージコレクタが参照カウントでは処理できない特定の条件の1つは、保持サイクルの検出と削除です。サイクル内でそのポイントへの強い参照を保持しているオブジェクトは、サイクル内のオブジェクトを参照しているすべてのオブジェクトがその中のオブジェクトへの参照を解放したとしても、標準の参照カウントで割り当てが解除されることはありません。ガベージコレクターは、このサイクルがより大きなオブジェクトグラフに根ざしていないことを確認し、スイープを実行するときにサイクル全体を削除できるようになります。