我正在使用Erlang中的二叉树实现。这是代码的一个片段,可以给你一个想法:
-record(node, {key, value, left, right}).
% ...
insert(Tree, {Key, Value}) when Key == Tree#node.key ->
#node{key=Key,
value=Value,
left=Tree#node.left,
right=Tree#node.right};
insert(Tree, {Key, Value}) when Key > Tree#node.key ->
Tree#node{right=insert(
Tree#node.right, {Key, Value})};
% ...
这里当我向树插入一个新的键和值时,我返回一个带有插入(或修改过的)节点的新树。
问题: VM实际上复制树和GC旧的(这将是效率低下的),或者将引用复制到旧分支并仅更改节点/受新密钥影响的分支?
相关:
答案 0 :(得分:3)
表达式Tree#node {right = ...}创建一个新记录(一个元组),除了'right'字段之外,它包含与Tree相同的条目。每个条目使用一个机器字。如果条目是“立即”,如原子或整数或空列表,则所有信息都在该单词中。否则,该条目是指向实际数据的标记指针(如元组或二进制)。在任何一种情况下,只有那个词被复制到新记录中;除非你发送消息,否则Erlang永远不会做“深层复制”。 (请注意,在ETS表中存储数据的行为就像将数据发送到表中一样。)只有旧的Tree记录才会变成垃圾。