似乎弱引用的实现在业界是保密的;-)。例如,截至目前,维基百科文章缺乏任何实现细节。并查看上面的答案(包括已接受的):“去看看源代码”或“我认为”;-\。
在所有答案中,只有一个引用 Python 的 PEP 205 的答案是有见地的。正如它所说,对于任何单个对象,如果我们将弱引用视为实体本身,则最多可以有一个弱引用。
其余部分描述 Squirrel 语言实现。所以,weakref 本身就是一个对象,当你把一个对象的弱引用放到某个容器中时,你实际上是把引用放到了weakref 对象上。每个可引用可数对象都有存储指向其弱引用的指针的字段,在实际请求该对象的弱引用之前,该指针为 NULL。每个对象都有请求weakref的方法,该方法要么从字段中返回现有的(单个)weakref,要么创建它并缓存在字段中。
当然,weakref 指向的是原始对象。因此,您只需要遍历所有处理对象引用的可用位置,并添加对弱引用的透明处理(即自动取消引用它)。(“透明”替代方案是添加虚拟“访问”方法,这将是大多数对象的身份,以及弱引用的实际取消引用。)
并且由于对象具有指向其弱引用的指针,因此对象可以在自己的析构函数中使弱引用为空。
这个实现非常干净(没有神奇的“调用 GC”之类的东西)并且具有 O(1) 运行时成本。当然,这是非常贪婪的内存 - 需要为每个对象添加 +1 指针字段,即使通常 90+% 的对象为 NULL。当然,VHLL 每个对象已经有很大的内存开销,并且可能有机会压缩不同的“额外”字段。例如,对象类型通常是一个小枚举,因此可以将类型和某种弱引用引用合并到单个机器字中(例如,将弱引用对象保存在单独的区域中,并使用索引)。