相关疑难解决方法(0)

StableNames比reallyUnsafePtrEquality#有什么优势,反之亦然?

数据稳定名称 a

稳定名称具有以下属性:如果sn1 :: StableName和sn2 :: StableName和sn1 == sn2,则通过在同一对象上调用makeStableName创建sn1和sn2.

反过来不一定如此:如果两个稳定名称不相等,那么它们命名的对象可能仍然相等.

reallyUnsafePtrEquality# :: a - > a - > Int#

reallyUnsafePtrEquality#返回GHC堆上的两个对象是否是同一个对象.它真的不安全,因为垃圾收集器会移动东西,闭包等.据我所知,它可以返回假阴性(它说两个对象不一样,但它们都是),但不是误报(说它们当他们不是时,他们会一样.

他们两个似乎做了同样的基本事情:他们可以告诉你两个对象是否绝对相同,但不是它们是否绝对不是.

我能看到的StableNames的优点是:

  • 他们可以散列.
  • 他们不那么不便携.
  • 他们的行为得到了很好的定义和支持.
  • 他们没有真正的不安全作为他们名字的一部分.

我可以在reallyUnsafePtrEquality#中看到的优点:

  • 它可以直接在有问题的对象上调用,而不必创建单独的StablesNames.
  • 您不必通过IO函数来创建StableNames.
  • 您不必保留StableNames,因此内存使用率较低.
  • RTS不需要做任何使StableNames工作的魔法,因此性能可能更好.
  • 它的名字真的很不安全,最后是#.铁杆!

我的问题是:

  • 我错过了什么吗?

  • 是否有任何用例,StableNames与他们命名的对象分开是有利的?

  • 是否比另一个更准确(不太可能返回假阴性)?

  • 如果你不需要散列,不关心可移植性,并且不会被使用名为reallyUnsafe的东西所困扰,是否有理由更喜欢StableNames而不是reallyUnsafePtrEquality#?

haskell ghc

13
推荐指数
1
解决办法
996
查看次数

标签 统计

ghc ×1

haskell ×1