julia可以像C一样获取内存地址(指针)吗?
可以的有Ptr类型,但是和C不同的是语言里是没有内存地址对应的。也就是说不保证一定会有内存地址(因为可能会被优化掉)。
不过Array类型是有内存地址的,它相当于一个C动态数组。
如果你需要和其他语言交互,用Ref
可以使一个值拥有固定内存位置,然后可以取地址:
julia> r=Ref(42)
Base.RefValue{Int64}(42)
julia> pointer_from_objref(r)
Ptr{Nothing} @0x00000001169bc5d0
julia> unsafe_load(Ptr{Int64}(ans))
42
Ref
也可以直接传递给ccall
。你需要保证在对方使用完之前r
不会被垃圾回收。
事实上mutable
对象都是有内存地址的:
julia> mutable struct M
x::Int
end
julia> m=M(42)
M(42)
julia> pointer_from_objref(m)
Ptr{Nothing} @0x0000000116a10100
julia> unsafe_load(Ptr{Int}(ans))
42
普通的类型,比如字面值1
,是immutable
的,虽然实现上也许它真的有内存地址(CPU寄存器放不下的话可能在栈上),但为了避免抽象泄漏,Julia不允许你尝试获取它们的地址。
1 个赞