如何使用弱阵列?

时间:2011-02-08 13:40:08

标签: ocaml

问题说明了一切。我有一个数据结构我不能Marshal因为一个弱哈希表...想知道我是否可以摆脱它:)

2 个答案:

答案 0 :(得分:11)

弱数组是一个弱指针数组。弱指针是可能被垃圾收集的值的引用。

如果在值上使用常规指针,则在裁判本身被垃圾收集之前,您将阻止其垃圾收集。如果参考人数较弱,则可在裁判前收集该值。

使用示例是将数据提供给多个接收器的源。如果源保持定期指向接收器的指针,则每当不再需要接收器时,它将不会被垃圾收集,直到源(例如可能永远不会发生)。如果源使用对接收器的弱引用,则给定接收器可能在源之前被垃圾收集。

另一个例子是使用弱哈希表(涉及弱数组)的类型的hashconsing。很快,hashconsing是一种记住在程序中创建和生存的给定类型的所有值的方法。与适当的值构造函数一起,这可以确保最大程度地共享该类型的值,并允许在该类型上实现结构相等作为物理相等。在这种情况下,如果使用非弱哈希表,程序不再使用的值永远不会被垃圾回收。

最后,许多人认为(错误地)弱引用对于实现缓存很有用。对值进行弱引用,如果是垃圾回收,则重新加载/重新计算该值。这不是一个好的缓存算法,因为主要的垃圾收集会回收不再引用的任何值。所以你的缓存算法没有可预测性或有用的属性,例如,缓存/可用内存的大小不超过给定的比率。

答案 1 :(得分:1)

在数据结构与其与Marshall模块兼容的结构一致表示之间使用双射映射函数对。