Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Erlang内存变量管理 我们考虑这个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=....._List_Variables_Memory_Erlang - Fatal编程技术网

List Erlang内存变量管理 我们考虑这个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=.....

List Erlang内存变量管理 我们考虑这个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=.....,list,variables,memory,erlang,List,Variables,Memory,Erlang,这段代码将为数十亿个元素分配空间,因此让我们尝试以下方法: L=[X1, X2,....., X10000]. 在Java中,“X1,X2,…”只是对内存分配的引用,因此Java中的这段代码将为这些变量的值分配内存,并将内存地址分配给这些变量,以引用这些值,因此当我们创建列表L时,我们称之为X1。。。。这些变量引用了先前的内存分配,我们只分配了一次内存 如果我们认为“=”是 一个表达式,而不是变量和内存地址之间的赋值(正如乔在书中所说的)变量X1,。。。。L列表中的X10000将第二次分配到

这段代码将为数十亿个元素分配空间,因此让我们尝试以下方法:

L=[X1, X2,....., X10000]. 
在Java中,“X1,X2,…”只是对内存分配的引用,因此Java中的这段代码将为这些变量的值分配内存,并将内存地址分配给这些变量,以引用这些值,因此当我们创建列表L时,我们称之为X1。。。。这些变量引用了先前的内存分配,我们只分配了一次内存

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

您已经在前面的问题上被推荐,第12.4.1节:

堆上的对象在一个进程的上下文中通过引用传递。如果使用元组作为参数调用一个函数,则只将对该元组的标记引用传递给被调用函数。当您构建新术语时,您还将仅使用对子术语的引用

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

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

X1 = [1,2],
L = [X1, X1]
情况更有趣(但仍用那句话解释);内存中的
[1,2]
副本与内存中的副本不同

L = [[1, 2], [1, 2]]
相反,
L
的两个成员指向同一个列表

基本上,Erlang为值分配内存,而不是为变量分配内存,这与C及其后代(包括Java)不同;变量实际上与内存地址不对应。

在前面的问题中,第12.4.1节:

堆上的对象在一个进程的上下文中通过引用传递。如果使用元组作为参数调用一个函数,则只将对该元组的标记引用传递给被调用函数。当您构建新术语时,您还将仅使用对子术语的引用

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

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

X1 = [1,2],
L = [X1, X1]
情况更有趣(但仍用那句话解释);内存中的
[1,2]
副本与内存中的副本不同

L = [[1, 2], [1, 2]]
相反,
L
的两个成员指向同一个列表


基本上,Erlang为值分配内存,而不是为变量分配内存,这与C及其后代(包括Java)不同;变量实际上并不对应于内存地址。

okey okey现在我明白了,我没有注意到这本书中的最后一句话:从子项构建新术语意味着从现有变量中创建新变量。非常感谢兄弟,这对我很有帮助。@Abdelhamid See。okey okey现在我明白了,我没有注意这本书的最后一句话:从子项构建新项意味着从现有变量中创建新变量非常感谢兄弟,这对我很有帮助。@Abdelhamid-See。