当程序不再需要数据结构时销毁它——Erlang



某些在Erlang中操作Tuples的函数,在操作后会生成新元组的副本。在大多数情况下,程序对生成新元组的旧元组副本不再感兴趣。让我们看一个例子:

<>之前change(Position,Tuple1,NewValue) when size(Tuple1)>10、位置& lt;10→NewTuple = erlang:setelement(Position, Tuple1, NewValue),%%此时我不想要Tuple1%%我现在想销毁Tuple1 !我该怎么做呢erlang:发送(myprocess NewTuple),好的。之前

在上面的例子中,我从一个已有的元组中创建了一个新的元组。如果我以后要这么做的话,我想自己销毁旧的副本。我有一种感觉,编译器/运行时系统会自动完成这项工作,但如果是这样的话,他们就不会给我们这样的函数:erlang:garbage_collect/0。我确信他们意识到我们可能需要隐式地管理我们的内存,这可能会使程序免于崩溃,并找到通过内存密集型代码部分的方法。

我明白,在erlang shell中,有可能使它忘记使用f/0, f/1的变量(我假设他们的意思是破坏变量)。然而,似乎我不能在我的模块/函数中使用它。我也怀疑在变量名前面加上下划线可能会加速运行时系统的破坏,例如,在我的代码中有些地方写:_Tuple1破坏Tuple1

。总之,问题是,如果我随后要从现有的元组中创建元组,并且在每一步我都想立即销毁旧的副本(我自己),我该怎么做?*注意*我明白效率指南禁止这样做,但是,如果我别无选择.....

伙计们,你们的解决方案是什么?由于

编译器很容易检测到:

    NewTuple = erlang:setelement(Position, Tuple1, NewValue),

Tuple1在这里不再被引用,并将删除它的链接。没有必要尝试帮助它做这件事,我保证它比你或我做得更好。下次有垃圾收集时,如果没有其他引用它,那么它将被回收。实际上,收集器不会"销毁旧副本",而只是将数据标记为空闲,以便可以重用。没有办法自己明确地做到这一点,这是一件非常好的事情!如果这是在其正常处理之外进行的,则会干扰正常的内存分配/垃圾收集。

更重要的是,这种显式内存管理正是我们想要避免的,这就是为什么它都是自动完成的。动态内存错误很容易制造,但很难在事后发现。例如,在这种情况下,你如何知道,我的意思是100%确定真的知道,这个元组在其他任何地方都没有被引用,所以它可以自由地被回收?垃圾回收员知道。所以把它留给收藏家吧。认真。

调用erlang:garbage_collect/0会更快地运行收集器,但很少需要显式地这样做。

没有办法。此时调用erlang:garbage_collect/0不会破坏Tuple1,因为它仍然可以从堆栈访问。

相关内容

  • 没有找到相关文章

最新更新