Дано:Действительно ли erlang реализует запись, копирование и изменение любым умным способом?
-record(foo, {a, b, c}).
я сделать что-то вроде этого:
Thing = #foo{a={1,2}, b={3,4}, c={5,6}},
Thing1 = Thing#foo{a={7,8}}.
С семантической точки зрения, вещь и thing1 являются уникальными объектами. Однако, с точки зрения реализации языка, полная копия Thing для создания Thing1 будет очень расточительной. Например, если запись была размером в мегабайт, и я сделал тысячу «копий», каждый из которых изменял пару байтов, я только что сжег гигабайт. Если внутренняя структура отслеживала представление родительской структуры и каждая производная, помеченная таким родителем таким образом, который указывал на ее собственное изменение, но сохранял все версии elses, производные могли быть созданы с минимальными издержками памяти.
Мой вопрос заключается в следующем: erlang делает что-нибудь умное - внутренне - для поддержания накладных расходов обычной эрланговой каракули;
Thing = #ridiculously_large_record,
Thing1 = make_modified_copy(Thing),
Thing2 = make_modified_copy(Thing1),
Thing3 = make_modified_copy(Thing2),
Thing4 = make_modified_copy(Thing3),
Thing5 = make_modified_copy(Thing4)
... как минимум?
Я прошу, потому что было бы несколько изменений в способе, которым я выполнял перекрестные коммуникации, если это было так.
Функции 'erts: size/1' и' erts: flat_size/1' должны быть 'erts_debug: size/1' и' erts_debug: flat_size/1'. – psyeugenic
Обновлен мой ответ. Спасибо, что указал на ошибку. – knutin
Привет, Зачем вы говорите, что не можете воспользоваться? спасибо ! – niahoo