![](/img/trans.png)
[英]Function argument binding rules for passing an array by reference vs passing pointer
[英]Julia-Lang anonymous vs named function behavior in passing argument
請參閱Julia doc:
在Julia中,函數的所有參數都通過引用傳遞。
當我從匿名函數中獲取Float64參數的內存地址時,它看起來是正確的。 但對於命名函數來說並非如此。
test = function (a::Float64)
println(pointer_from_objref(a));
end
# => (anonymous function)
function test1(a::Float64)
println(pointer_from_objref(a));
end
# => test1 (generic function with 1 method)
value=0.0;
println(pointer_from_objref(value))
# => Ptr{Void} @0x00007fe797c5c020
test(value)
# => Ptr{Void} @0x00007fe797c5c020
test1(value)
# => Ptr{Void} @0x00007fe799e83960
正如@Gnimuc所提到的,Julia-Lang Doc還有另一段解釋了Argument Passing Behavior
Julia函數參數遵循有時稱為“pass-by-sharing”的約定,這意味着值在傳遞給函數時不會被復制。 函數參數本身充當新的變量綁定(可以引用值的新位置),但它們引用的值與傳遞的值相同。
這種“傳遞共享”行為與上述代碼之間是否存在任何關系?
從Julia文檔中的pointer_from_objref(object_instance)
函數我們得到這樣的描述:
獲取Julia對象的內存地址作為Ptr。 生成的Ptr的存在不會保護對象不被垃圾收集,因此您必須確保在Ptr將被使用的整個時間內對象保持引用。
檢查以下測試:
x=10
y=10
println(pointer_from_objref(x)) # => Ptr{Void} @0x039ee2c0
println(pointer_from_objref(y)) # => Ptr{Void} @0x039ee2c0
我們可以看到pointer_from_objref
無法返回不可變對象的本地地址,這是因為這個對象是按值傳遞的,所以我認為上面問題的答案是在那里濫用了pointer_from_objref
。
擴展Reza的答案,這里需要注意的是“pass-by-sharing”推理不適用於不可變對象。 如果你嘗試相同的代碼,但使用浮動向量作為參數,你會得到預期的行為,即所有指針是相同的:
test = function (a::Vector{Float64})
println(pointer_from_objref(a));
end
# => (anonymous function)
function test1(a::Vector{Float64})
println(pointer_from_objref(a));
end
# => test1 (generic function with 1 method)
value=[0.0,0.1];
println(pointer_from_objref(value))
# => Ptr{Void} @0x0000000084601be0
test(value)
# => Ptr{Void} @0x0000000084601be0
test1(value)
# => Ptr{Void} @0x0000000084601be0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.