当我用MFA生成一些东西时,如果我包含一个大的列表,dict等会被复制吗?

时间:2012-08-08 20:30:21

标签: erlang

它令人困惑,因为它在我更新它时仍然“复制”,但据我所知,它只是复制指针,而不是制作某种深层复制。如果我产生它会产生某种完整的副本吗?如果我从不修改它怎么办?

1 个答案:

答案 0 :(得分:5)

是的,当你产生时,你需要将传递给衍生函数的每个术语复制到新进程的堆中。

更新列表或dict时,不会复制任何未更改的元素,因为指向这些元素的指针位于同一堆中,可用于新术语。请考虑以下示例:

A = [1,2,3],
B = [0|A].

在这种情况下,对于B项,您只需要在堆中为一个cons单元分配内存,其第一个元素是术语0,第二个元素是指向第一个cons单元格的指针A列表。 A列表位于同一堆中。

当你产生时,新进程有自己的堆,因此它所使用的所有数据都必须在那里复制。

如果生成的进程不会访问大型数据结构中的所有元素,那么在生成之前提取相关数据或使用ETS表是有意义的(当您传递ETS表时,只传递表引用但您需要复制或删除您更改或访问的任何元素。