'daki bir listenin hafıza adresi nasıl yazdırılır Bazı programlama dillerinin yapılandırılmış verilere belleği nasıl atayacağını inceliyorum (bu durumda diziler üzerinde çalışıyorum).Haskell
Array Start: <dec addr> | <hex addr> --Shows where the array itself is
Array 1: <dec addr> | <hex addr> --Memory address of the first element
Array 2: <dec addr> | <hex addr| --Memory address of the second element
:
bölüm 3.
import Data.Array.IO
arr <- newArray (1,10) 37 :: IO (IOArray Int Int) --Sets default to 37
Ve ne ben yapmaya çalışıyorum üzerinde here gösterildiği gibi dizi yaratıyorum baskı ve öğelerin her birinin bellek adresi, bir şey böyledir Sahip olduğum problem Haskell'deki bir elemanın hafıza adresi değerini nasıl alacağımı bilmem.
Python'un id(object)
veya Ruby'nin object.object_id
benzeri bir işlevi var mı? Bu öncelikle bir Ptr'
kurucu içinde a
sarılması ve daha sonra Ptr' a
döküm çalışır
{-# LANGUAGE MagicHash, BangPatterns #-}
import GHC.Exts
-- A datatype that has the same layout as Word and so can be casted to it.
data Ptr' a = Ptr' a
-- Any is a type to which any type can be safely unsafeCoerced to.
aToWord# :: Any -> Word#
aToWord# a = let !mb = Ptr' a in case unsafeCoerce# mb :: Word of W# addr -> addr
unsafeAddr :: a -> Int
unsafeAddr a = I# (word2Int# (aToWord# (unsafeCoerce# a)))
:
bunun mümkün olup olmadığından emin değilim, ama sorun olduğu takdirde bellek adresi sebebiyle çöp toplayıcı tarafından tehcir istediğiniz zaman değiştirebilirsiniz. –
Evet, ancak sadece belirli bir zamanda bellek adresini yazdırmak istiyorum, bu nedenle daha sonra yürütme –
içinde bir 'reallyUnsafePtrEquals' var ise, 'gerçektenUnsafe' değişikliklerin GHC'nin bu kadar büyüyü açığa çıkaracağından şüphelenir. – jozefg