Уничтожение структуры данных, когда программе она больше не нужна - Erlang

Некоторые функции, которые манипулируют Tuples в Erlang, приведите в копии новых кортежей после операции. В большинстве случаев программа больше не интересуется старой копией кортежа, из которой была сделана новая. Давайте посмотрим на пример:

изменить (Position,Tuple1,NewValue), когда размер (Tuple1) > 10,Position < 10 ->
    NewTuple = erlang:setelement(Position, Tuple1, NewValue),
    %% на данный момент я не хочу Tuple1
    %% Я хочу уничтожить Tuple1 на этом этапе!
    %% как мне это сделать
    Эрл: отправить (myprocess,NewTuple),
    Хорошо.

В приведенном выше примере я создаю новый кортеж из существующего. Если я собираюсь сделать это впоследствии, я бы хотел уничтожить старые копии сам. У меня есть ощущение, что система компилятора / среды выполнения делает это автоматически, но если бы это было так, они бы не дали нам такие функции, как: erlang:garbage_collect/0, Уверены, что они поняли, что нам может понадобиться неявное управление нашей памятью, возможно, это спасет программу от сбоев и обойдёт часть кода, интенсивно использующую память.

Я понимаю, что в erlang shellможно заставить его забыть переменную (я предполагаю, что они имели в виду уничтожить переменную), используя f/0, f/1, Тем не менее, кажется, я не могу использовать это в моих модулях / функциях. У меня также есть сомнения, что размещение подчеркивания перед этим именем переменной может ускорить уничтожение системой времени выполнения, то есть кое-где, где в моем коде пишется: _Tuple1 разрушать Tuple1

, Таким образом, вопрос в том, что,если я собираюсь впоследствии создавать кортежи из существующих, и на каждом шаге я хочу немедленно (самостоятельно) уничтожать старые копии, как мне это сделать? * Примечание * Я понимаю, что руководство по эффективности запрещает это, но, если у меня нет выбора.....

Ребята помогите, какое у вас решение этой проблемы? Спасибо

2 ответа

Решение

Компилятор легко обнаруживает это после:

    NewTuple = erlang:setelement(Position, Tuple1, NewValue),

Tuple1 здесь больше нет ссылок и удалит свою ссылку на него. Нет необходимости пытаться помочь ему сделать это, я гарантирую, что он справится с этим лучше, чем вы или я. В следующий раз, когда будет сборка мусора, и если нет других ссылок на нее, она будет исправлена, На самом деле сборщик не "уничтожает старые копии", а просто помечает данные как свободные, чтобы их можно было использовать повторно. Невозможно сделать это самостоятельно, что очень хорошо! Это мешало бы нормальному выделению памяти / сборке мусора, если бы это происходило вне его обычной обработки.

Более важно, что именно этого явного управления памятью мы хотим избежать, поэтому все это делается автоматически. Динамические ошибки памяти - все это легко сделать, а потом трудно найти. Например, в этом случае, как вы ЗНАЕТЕ, я имею в виду на 100% достоверность ДЕЙСТВИТЕЛЬНО ЗНАНИЯ, что на этот кортеж больше не ссылаются, поэтому он может быть освобожден? Сборщик мусора знает. Так что оставь это коллекционеру. Шутки в сторону.

призвание erlang:garbage_collect/0 запускает сборщик чуть раньше, но редко нужно делать это явно.

Нет способа сделать это. призвание erlang:garbage_collect/0 на данный момент не разрушит Tuple1 либо так как он все еще доступен из стека.

Другие вопросы по тегам