它令人困惑,因为它在我更新它时仍然“复制”,但据我所知,它只是复制指针,而不是制作某种深层复制。如果我产生它会产生某种完整的副本吗?如果我从不修改它怎么办?
答案 0 :(得分:5)
是的,当你产生时,你需要将传递给衍生函数的每个术语复制到新进程的堆中。
更新列表或dict时,不会复制任何未更改的元素,因为指向这些元素的指针位于同一堆中,可用于新术语。请考虑以下示例:
A = [1,2,3],
B = [0|A].
在这种情况下,对于B
项,您只需要在堆中为一个cons单元分配内存,其第一个元素是术语0
,第二个元素是指向第一个cons单元格的指针A
列表。 A
列表位于同一堆中。
当你产生时,新进程有自己的堆,因此它所使用的所有数据都必须在那里复制。
如果生成的进程不会访问大型数据结构中的所有元素,那么在生成之前提取相关数据或使用ETS表是有意义的(当您传递ETS表时,只传递表引用但您需要复制或删除您更改或访问的任何元素。