【发布时间】:2014-08-27 06:07:30
【问题描述】:
据我了解,没有字段的类型的构造函数是“静态分配的”和 GHC shares these between all uses,而 GC will not move these。
如果这是正确的,那么我希望在 False 和 Nothing 这样的值上使用 reallyUnsafePtrEquality# 非常安全(没有误报或误报),因为它们只能表示为指向单个实例的相同指针那个构造函数。
我的推理正确吗?是否有任何潜在的陷阱,或者有理由怀疑这可能在不久的将来版本的 GHC 中变得不安全?
【问题讨论】:
-
可能是真的。另一方面,对于没有字段的构造函数来说,性能胜过乏味的老
(==)似乎是非常小的...... -
@DanielWagner 我的实际用例是在盒装引用上使用新的 CAS primops。当使用
atomic-primops库时,我希望能够缓存Ticket Nothing(例如)并确保它永远不会过时。 -
您可能还需要小心插件等。
-
不,我的意思是那些将代码加载到正在运行的 Haskell 程序中的插件最终可能会得到它们自己的那些空构造函数的副本。我不知道哪种方式,但这是我担心的事情。
-
我很确定 nullary 构造函数指针被重写为指向 .TEXT 只有在它们幸免于 GC 之后。它们的初始分配和指针仍然指向动态分配的空间,这使得这里提出的技术不安全。