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 不同;变量并不真正对应于内存地址。
我们考虑这个 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 不同;变量并不真正对应于内存地址。