内存管理 – 为什么纯函数语言不使用引用计数?

在纯函数式语言中,数据是不可变的。使用引用计数,创建参考周期需要更改已创建的数据。看起来纯函数式语言可以使用引用计数,而不必担心周期的可能性。上帝是对的吗?如果是,为什么不呢?

我知道在许多情况下,引用计数比GC慢,但至少它减少了暂停时间。在停顿时间不好的情况下,可以选择使用引用计数将是很好的。

您的问题是基于错误的假设。它完全可能有循环引用和不可变的数据。考虑下面的使用不可变数据创建循环引用的C#示例。

class Node { 
  public readonly Node other;
  public Node() { 
    other = new Node(this);
  }
  public Node(Node node) {
    other = node;
  }
}

这种类型的技巧可以在许多功能语言中完成,因此任何收集机制必须处理循环引用的可能性。我不是说一个ref计数机制是不可能与循环引用,只是它必须处理。

编辑ephemient

在回应评论…这在Haskell是微不足道的

data Node a = Node { other :: Node a }
recursiveNode = Node { other = recursiveNode }

并且在SML中几乎没有任何努力。

datatype 'a node = NODE of unit -> 'a node
val recursiveNode : unit node =
    let fun mkRecursiveNode () = NODE mkRecursiveNode
    in mkRecursiveNode () end

无需突变。

http://stackoverflow.com/questions/791437/why-dont-purely-functional-languages-use-reference-counting

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:内存管理 – 为什么纯函数语言不使用引用计数?