0

なぜ弱参照が、ガベージコレクションによって標準のオブジェクト参照と同様に扱われる組み込み型ではないのか疑問に思います。C#では、WeakReferenceクラス(マネージヒープ自体に作成され、クリーンアップにファイナライザーを使用するため、パフォーマンスとメモリに大きな影響を与える)を使用するか、GCHandleを手動で割り当てる必要があります(後で手動で再度解放する必要があります)。 。

原則として、弱参照のGCは次のように実装します。

  1. ライブオブジェクトを識別するために、GCはすべてのルートからオブジェクトツリーをウォークする必要があります。オブジェクトへの参照が見つかった場合、そのオブジェクトは到達可能としてマークされます。対照的に、オブジェクトへの弱参照が見つかった場合、これは最初のステップで無視されます。

  2. 2番目のステップでは、GCは到達不能なメモリブロックが配置されている場所を調べ、管理対象ヒープ(または少なくともその一部)を圧縮します。これを行うときは、オブジェクトツリーを再度ウォークし、移動されたオブジェクトへのすべての参照(通常および弱い)を更新する必要があります。さらに、到達可能としてマークされていないオブジェクトへの弱参照が見つかった場合、それを無効としてマークするには、null(または他の明確に定義された無効なメモリ位置)に設定する必要があります。

4

2 に答える 2

2

おそらく、それらは、より目立つ表現に値するほど頻繁に必要とされない傾向があるためです.

于 2012-09-07T20:51:49.203 に答える
0

ガベージ コレクターは、循環参照が存在する場合でも、通常の参照で既に非常に優れた機能を果たしています。(参照カウントの世界では、それはまったく別の話です)。オブジェクト間で循環参照を行うことができ、ほとんどの場合、正しくクリーンアップされます。つまり、WeakRef が必要になることは非常にまれであるため、CLI に組み込まれていることはおそらく保証されませんでした。

于 2012-09-07T21:07:02.607 に答える