为什么不可变类型通过复制传递?

时间:2018-06-20 01:40:11

标签: julia

types的文档中,内容为:

  

具有不变类型的对象通过复制传递(在赋值语句和函数调用中),而可变类型通过引用传递。

当无法更改对象时,复制整个对象的目的是什么?为什么不只复制参考?

此外,当我尝试使用

进行测试时
struct Foo
    bar::Int
end

x = Foo(10)
y = x

pointer_from_objref(x) # Ptr{Void} @0x00000001141ea760

pointer_from_objref(y) # Ptr{Void} @0x00000001141ea760

它表明对象是相同的。我误会了吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

pointer_from_objref在您不可变类型上不起作用。结果取决于您调用它的上下文。

尝试类似

function test(x) return pointer_from_objref(x) end
println(test(x))
println(test(y))

考虑到the source试图为不可变的参数引发错误,我实际上感到非常惊讶。

对于您很小的不可变对象,实际上一个副本(或仅将值保留在一个注册者中)比绕开指针(指针与int大小相同,显然也需要复制到)便宜得多。函数调用)。