我的理解是,没有字段的类型的构造函数是"静态分配"的,GHC 在所有用途之间共享这些构造函数,并且GC不会移动它们.
如果这是正确的,那么我希望使用reallyUnsafePtrEquality#on值False和Nothing非常安全(没有错误否定或肯定),因为它们只能表示为与该构造函数的单个实例相同的指针.
我的推理是否正确?是否有任何潜在的问题或理由怀疑在不久的将来版本的GHC中这可能会变得不安全?
Dan*_*zer 12
我实际上设法reallyUnsafePtrEquality做错了.
这是我的最小代码示例
{-# LANGUAGE MagicHash #-}
import GHC.Prim
-- Package it up nicely
ptrCmp :: a -> a -> Bool
ptrCmp a b = case (reallyUnsafePtrEquality# a b) of
0# -> False
1# -> True
main = do
b <- readLn
let a = if b then Nothing else Just ()
a' = Nothing
print $ a == a' -- Normal
print $ ptrCmp a a' -- Evil
Run Code Online (Sandbox Code Playgroud)
并做一些类似的事情
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.8.2
$ ghc unsafe.hs
$ ./unsafe
True
True
False
Run Code Online (Sandbox Code Playgroud)
所以......是的,reallyUnsafePtrEquality仍然是邪恶的.
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |