Управление переменными памяти в Erlang - PullRequest
1 голос
/ 05 мая 2020

мы рассматриваем этот пример 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]. 

in Java "X1, X2, ... "являются просто ссылками на выделение памяти, поэтому этот код в Java будет выделять память для значений этих переменных и назначать переменным адреса памяти для ссылки на эти значения, поэтому, когда мы создаем список L и вызываем X1 .... переменные ссылаются на предыдущее распределение памяти, и мы выделяем память только один раз.

если учесть, что «=» является выражением, а не присваиванием между переменной и адресом памяти (как сказал Джо в своей книге), переменные X1, .... X10000 в L-списке будут выделяется в памяти второй раз?

1 Ответ

3 голосов
/ 05 мая 2020

Из книги вас уже рекомендовали по предыдущему вопросу, раздел 12.4.1:

Объекты в куче передаются по ссылкам в контексте одного процесса. Если вы вызываете одну функцию с кортежем в качестве аргумента, то вызываемой функции передается только тегированная ссылка на этот кортеж. При создании новых терминов вы также будете использовать только ссылки на дополнительные термины.

L=[X1,...]

создает новый термин, поэтому он использует только ссылки на X1 et c. и выделяет достаточно новой памяти для составления списка; он не копирует списки, указанные в X1 et c.

В обоих случаях элементы списка передаются по ссылке. Теперь, если у вас есть

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

, ситуация более интересная (но все же объясняется этой цитатой); в памяти нет двух копий [1, 2], как было бы в

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

, вместо этого оба члена L указывают на один и тот же список.

По сути, Erlang выделяет память для значения , не для переменных, в отличие от C и его потомков, включая Java; переменная действительно не соответствует адресу памяти.

...