【问题标题】:Erlang data structures: copies or referencesErlang 数据结构:副本或引用
【发布时间】:2013-09-04 19:07:12
【问题描述】:

我正在使用 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 旧的(效率低下),或者复制对旧分支的引用并仅更改节点/受新密钥影响的分支?

相关:

【问题讨论】:

    标签: erlang


    【解决方案1】:

    表达式 Tree#node{right=...} 创建一个新记录(一个元组),其中包含与 Tree 相同的条目,但 'right' 字段除外。每个条目使用一个机器字。如果条目是“立即数”,例如原子、整数或空列表,则所有信息都在该单词中。否则,该条目是指向实际数据的标记指针(如元组或二进制)。在任何一种情况下,只有那个词被复制到新记录中; Erlang 从不做“深拷贝”,除非你发送消息。 (请注意,在 ETS 表中存储数据的行为就像您将数据发送到表中一样。)只有旧的 Tree 记录会变成垃圾。

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 1970-01-01
      • 2014-07-10
      • 2015-03-20
      • 2012-11-05
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多