3

这很令人困惑,因为当我更新它时它无论如何都会“复制”,但据我所知,它只是在大多数时间复制指针,而不是进行某种深度复制。如果我生成,它会制作某种完整的副本吗?如果我从不修改它怎么办?

4

1 回答 1

5

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

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

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

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

当你生成时,新进程有自己的堆,所以它使用的所有数据都必须复制到那里。

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

于 2012-08-09T08:53:36.310 回答