我的印象是,在Erlang中,当调用一个函数时,Erlang会将整个参数从调用者深层复制到被调用者,大部分是由Erlang Efficiency Guide告诉的。然而,我注意到指南和original paper主要关注记录而不是列表。我试图找到一个规范或解释Erlang如何传递列表参数的东西,但这些努力是徒劳的。
这时,我的一位同事来找我,告诉我Erlang像C指针和Golang切片一样“通过引用”传递列表参数,但根据我的经验,这似乎不是真的。由于手头没有可靠的知识,我无法证明我或他的假设。
我想知道是否有这样的文档、论文或规范可以让我了解Erlang是如何处理列表参数的?毫无疑问,越正式越好,但实际上即使是博客或电子邮件也可以做到。
1条答案
按热度按时间drnojrws1#
当调用函数时,所有的数据结构都是通过引用传递的(例外是“立即数”,如小整数和原子,它们是通过值直接传递的)。对于普通的函数调用,你永远不必担心开销。
然而,当产生进程时,其初始函数调用的任何参数都需要复制到新进程的堆中,就像它们是在进程启动时发送到进程的消息一样。这样,新进程是在同一台计算机上运行还是通过网络在不同的计算机上运行都无关紧要。
请参阅The Beam Book以深入了解Beam虚拟机的工作原理。