Erlang内存变量管理

问题描述 投票:0回答:2

我们考虑这个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.......时,变量引用到内存的前次分配,我们只分配了一次内存。

如果我们认为"="是一个表达式,而不是一个变量和内存地址之间的分配(这就是Joe在他的书中所说的)变量X1,......。L列表中的X10000将第二次被分配到内存中?

list variables memory erlang
2个回答
3
投票

本子 前面的问题12.4.1节已经向你推荐过。

堆上的对象是在一个进程的上下文中通过引用传递的。 如果你以一个元组作为参数调用一个函数,那么只有对该元组的标记引用才会传递给被调用的函数。 当你建立新的术语时,你也只会使用子术语的引用。

L=[X1,...]

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

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

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

情况比较有趣(但还是用这句话来解释);没有两份的。[1, 2] 记忆中

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

反而 L 指向同一个列表。

从根本上说,Erlang为以下内容分配内存 价值观而对于变量来说,就不一样了,不像C和它的后代包括Java,一个变量并不真正对应一个内存地址。

© www.soinside.com 2019 - 2024. All rights reserved.