Erlang 内存变量管理

Erlang memory variables management

我们考虑这个 Erlang 示例:

X1=[1,2,4,6....we consider there are 10 millions element],
X2=[2,6,5,2,...we consider there  are 100 millions element],
X3=.......
. 
. 

X10000=.....

此代码将为数十亿个元素分配空间,所以让我们试试这个:

L=[X1, X2,....., X10000]. 
Java "X1, X2,..." 中的

只是对内存分配的引用,因此 Java 中的这段代码将为这些变量的值分配内存,并将内存地址分配给变量以供参考朝向这个值,所以当我们创建列表 L 并调用 X1 .... 变量参考先前的内存分配时,我们只分配了一次内存。

如果我们认为“=”是 变量和内存地址之间的表达式而不是赋值(乔在他的书中说的)变量 X1,.... L 列表中的 X10000 将第二次分配到内存中?

来自 the book 您已经在上一个问题第 12.4.1 节中被推荐:

Objects on the heap are passed by references within the context of one process. If you call one function with a tuple as an argument, then only a tagged reference to that tuple is passed to the called function. When you build new terms you will also only use references to sub terms.

L=[X1,...]

正在构建一个新术语,因此它只使用对X1等的引用,并分配足够的新内存来制作一个列表;它不会复制 X1

引用的列表

在这两种情况下,列表成员都是通过引用传递的。现在如果你有

X1 = [1,2],
L = [X1, X1]

情况更有趣(但仍然用那句话解释);内存中没有 [1, 2] 的两个副本,就像

中那样
L = [[1, 2], [1, 2]]

相反,L 的两个成员都指向同一个列表。

从根本上说,Erlang 为 分配内存,而不是为变量分配内存,这与 C 及其后代包括 Java 不同;变量并不真正对应于内存地址。