Когда необходимо освободить массив? - PullRequest
0 голосов
/ 01 июня 2018

Я прочитал, что применение DEALLOCATE к выделенному массиву освобождает пространство, которое он использовал.Я имею дело с несколькими размещаемыми массивами в моей программе, но никогда не беспокоюсь об их освобождении.Есть ли способ определить, влияет ли / или нет освобождение на время выполнения?

Заранее спасибо

PS: я не склонен делать этот тест напрямую (сравнивая время выполнения с ибез освобождения), поскольку программа зависит от случайных переменных, значения которых в конечном итоге влияют на производительность.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Могут ли освобожденные переменные, которые больше не нужны, влиять на скорость выполнения?Да.Это вероятно в "нормальных" программах?Нет, если не предотвращать утечки памяти.

Нет ценной эвристики, о которой я знаю, чтобы помочь вам определить полезность освобождения средств "для скорости".

Как упоминалось ранее, освобождение может бытьнеобходимо для правильности или предотвращения утечек памяти.

Однако, если программе требуется финализация распределяемой переменной для корректности, то для этого будет необходимо иметь оператор deallocate: финализация не происходит при прекращении выполненияпроисходит с помощью оператора остановки или завершения программы.


Распределяемые переменные, объявленные в процедуре (подпрограмме или функции) без атрибута save (так называемые несохраненные локальные переменные), освобождаются автоматически, когда процедуразавершает выполнение.

Как историческая справка, однако, это не было правдой в Fortran 90. В Fortran 90 такие переменные не были освобождены, и хуже было то, что статус их распределения стал неопределенным (так что даже распределениестатус не может быть QueRied).Один действительно хотел deallocate там.Этот недостаток был исправлен в Фортране 95, но привычки и код могут жить долго.

0 голосов
/ 01 июня 2018

Действительно, освобождение освобождает память, занятую переменными, но не всегда вам нужно делать это вручную.

Если вы знаете, что вам больше не нужно содержимое переменной И вам нужно освободитьпамяти для других переменных, которые должны быть выделены (или для системы), вы можете использовать оператор deallocate.

Однако освобождение происходит автоматически, когда переменная выходит из области видимости (Fortran 95 или более поздняя версия, как указано@francescalus) или когда вы достигнете конца программы.

Кроме того, освобождение происходит автоматически, когда это необходимо, перед присваиванием, если размеры массива не совпадают или если переменная полиморфна и должна принимать согласованнуюдинамический тип.(Это поведение Fortran2003 или новее, и может потребоваться включить его на некоторых компиляторах.)

Более того, когда фактический аргумент связан с аргументом фиктивного аргумента, который имеет атрибут INTENT(OUT), происходит освобождениеперед вводом процедуры.

** Предупреждение для переменных-указателей : **

Если вы явно выделили хранилище для переменной pointer (с помощью оператора allocate), и после этого вы выполняете привязку указателя (=>), освобождение не происходит автоматически.Вы несете ответственность за освобождение переменной перед ее выполнением, иначе произойдет утечка памяти.

В качестве последнего замечания, попытка освободить переменную, которая не была выделена, приводит к ошибке.Вы можете проверить, выделяется ли выделяемая переменная с помощью встроенной функции allocated.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...