我们考虑这个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将第二次被分配到内存中?
从 本子 前面的问题12.4.1节已经向你推荐过。
堆上的对象是在一个进程的上下文中通过引用传递的。 如果你以一个元组作为参数调用一个函数,那么只有对该元组的标记引用才会传递给被调用的函数。 当你建立新的术语时,你也只会使用子术语的引用。
L=[X1,...]
正在构建一个新的术语,所以它只使用对子术语的引用。X1
等,并分配足够的新内存来制作一个列表;它不会复制由 X1
等。
在这两种情况下,列表成员都是通过引用传递的。现在如果你有
X1 = [1,2],
L = [X1, X1]
情况比较有趣(但还是用这句话来解释);没有两份的。[1, 2]
记忆中
L = [[1, 2], [1, 2]]
反而 L
指向同一个列表。
从根本上说,Erlang为以下内容分配内存 价值观而对于变量来说,就不一样了,不像C和它的后代包括Java,一个变量并不真正对应一个内存地址。