弱参照の実装は、業界では秘密にされているようです ;-)。たとえば、現時点では、ウィキペディアの記事には実装の詳細がありません。そして、上記の回答(受け入れられたものを含む)を見てください:「ソースを見てください」または「私は思う」;-\ .
すべての回答のうち、Python の PEP 205 を参照しているものだけが洞察に満ちています。それが言うように、weakref をエンティティ自体として扱う場合、任意の単一のオブジェクトに対して、最大で 1 つの弱参照が存在する可能性があります。
残りは Squirrel 言語の実装について説明します。したがって、weakref はそれ自体がオブジェクトです。オブジェクトへの弱い参照をコンテナに配置すると、実際には weakref オブジェクトへの参照が配置されます。各参照カウント可能オブジェクトには、そのオブジェクトへの weakref が実際に要求されるまで NULL であるその weakref へのポインターを格納するフィールドがあります。各オブジェクトには、weakref を要求するメソッドがあり、フィールドから既存の (シングルトンの) weakref を返すか、それを作成してフィールドにキャッシュします。
もちろん、weakref は元のオブジェクトを指しています。したがって、オブジェクトへの参照が処理されるすべての使用可能な場所を調べて、weakref の透過的な処理を追加するだけです (つまり、自動的に参照解除します)。(「透過的な」代替手段は、ほとんどのオブジェクトのアイデンティティとなる仮想の「アクセス」メソッドと、weakref の実際の逆参照を追加することです。)
また、オブジェクトはそのweakrefへのポインタを持っているため、オブジェクトは自身のデストラクタでweakrefをNULL化できます。
この実装は非常にクリーンで (魔法の「GC への呼び出し」などはありません)、O(1) のランタイム コストがあります。もちろん、それはメモリをかなり貪欲です - 通常は 90+% のオブジェクトが NULL であるにもかかわらず、各オブジェクトに +1 ポインタ フィールドを追加する必要があります。もちろん、VHLL には既にオブジェクトごとに大きなメモリ オーバーヘッドがあり、さまざまな「余分な」フィールドを圧縮する可能性があります。たとえば、オブジェクト型は通常小さな列挙であるため、型とある種の weakref 参照を 1 つの機械語にマージすることができる場合があります (たとえば、weakref オブジェクトを別の領域に保持し、そのインデックスを使用します)。