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

Bre*_*k89 3 erlang

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

aro*_*tav 5

是的,当您生成时,需要将传递给生成函数的每个术语复制到新进程的堆中.

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

A = [1,2,3],
B = [0|A].
Run Code Online (Sandbox Code Playgroud)

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

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

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