module Ephemeron:sig
..end
短暂对象和弱哈希表。
短暂对象和弱哈希表在希望缓存或记忆函数计算时很有用,只要参数和函数被使用,就不会因持续保留不再有用的旧计算结果而造成内存泄漏,因为某个参数或函数被释放。使用 Hashtbl.t
的实现不适合,因为所有关联都会将参数和结果保存在内存中。
短暂对象还可以用于向任意打包的 OCaml 值 "添加" 字段:可以在没有内存泄漏的情况下,将一些信息附加到由外部库创建的值。
短暂对象持有某些键和一个或零个数据。它们都是打包的 OCaml 值。短暂对象的键具有与垃圾收集器中的弱指针相同的行为。实际上,OCaml 弱指针是作为没有数据的短暂对象实现的。
短暂对象的键和数据被称为如果它们指向一个值则为满,如果该值从未被设置、已被取消设置或被 GC 删除,则为空。在访问键或数据的函数中,这两种状态由 option
类型表示。
如果所有满的键都是活的,并且短暂对象是活的,则垃圾收集器将数据视为活的。当某个键不再被 GC 视为活的时,数据将从短暂对象中清空。数据可能由于其他原因而处于活动状态,在这种情况下,GC 不会释放它,但短暂对象将不再保存该数据。
短暂对象使值的存活性概念变得复杂,因为它不再与通过常规指针(非弱指针和非短暂对象)从根值可达性等效。使用短暂对象时,存活性的概念是由以下最小不动点构建的:一个值是活的,如果
备注
output_value
或 Marshal
模块中的函数进行序列化。短暂对象在本文中以语言无关的方式定义:B. Hayes,Ephemerons:一种新的终结机制,OOPSLA'97
未同步访问
对弱哈希表的未同步访问可能会导致弱哈希表状态无效。因此,必须同步对缓冲区的并发访问(例如,使用 Mutex.t
)。
module type S =sig
..end
函子 Ephemeron.K1.Make
和 Ephemeron.K2.Make
的输出签名。
module type SeededS =sig
..end
函子 Ephemeron.K1.MakeSeeded
和 Ephemeron.K2.MakeSeeded
的输出签名。
module K1:sig
..end
具有一个键的短暂对象。
module K2:sig
..end
具有两个键的短暂对象。
module Kn:sig
..end
具有任意数量相同类型键的短暂对象。