Erlang数据结构:副本或引用

Erlang数据结构:副本或引用,erlang,Erlang,我正在玩Erlang中的二叉树实现。下面是一段代码,让您了解: -记录(节点,{key,value,left,right})。 % ... 当Key==Tree#node.Key-> #节点{key=key, 值=值, 左=树#节点。左, 右=树#节点.右}; 当Key>Tree#node.Key-> 树#节点{右=插入( 树#node.right,{Key,Value}); % ... 在这里,当我向树中插入一个新的键和值时,我返回一个带有插入(或修改)节点的新树 问题:虚拟机是否真的会复制

我正在玩Erlang中的二叉树实现。下面是一段代码,让您了解:

-记录(节点,{key,value,left,right})。
% ...
当Key==Tree#node.Key->
#节点{key=key,
值=值,
左=树#节点。左,
右=树#节点.右};
当Key>Tree#node.Key->
树#节点{右=插入(
树#node.right,{Key,Value});
% ...
在这里,当我向树中插入一个新的键和值时,我返回一个带有插入(或修改)节点的新树

问题:虚拟机是否真的会复制树并将其GC到旧的树(这将是低效的),或者复制对旧分支的引用并仅更改受新键影响的节点/分支

相关:

表达式树#节点{right=…}创建一个新记录(元组),其中除了“right”字段外,还包含与树相同的条目。每个条目使用一个机器字。如果一个条目是一个“立即数”,比如一个原子、一个整数或一个空列表,那么所有的信息都在这个单词中。否则,条目是指向实际数据(如元组或二进制)的标记指针。在这两种情况下,只有该单词被复制到新记录中;除了在发送消息时,Erlang从不进行“深度复制”。(请注意,在ETS表中存储数据的行为类似于将数据发送到表中。)只有旧的树记录将成为垃圾