Я могу перераспределить выделяемую переменную или массив без явной процедуры освобождения / выделения, как описано в Автоматическое выделение массива при назначении в Fortran , если мой компилятор Fortran 2003 соответствует.Например,
integer, allocatable :: i(:)
i = [1,2,3]
i = [1,2,3,4,5]
по сравнению со старым ( Fortran 90 ) способом:
if( allocated(i) ) deallocate(i)
allocate(i(3))
i = [1,2,3]
if( allocated(i) ) deallocate(i)
allocate(i(5))
i = [1,2,3,4,5]
Какие или преимущества и недостатки этой новой техники?Это, конечно, гораздо более лаконичный код, чем старый.Но есть ли причины отдавать предпочтение старому?Я все еще вижу старый способ в примерах кода гораздо больше, чем новый, но, возможно, это только потому, что Fortran 90 все еще используется больше, чем Fortran 2003.
В качестве быстрой проверки синхронизации я зациклил приведенный выше код 100 000 000 разпод gfortran 4.8.5 и обнаружил, что новый способ также, кажется, быстрее, работает около 4 секунд (новый путь) против 6 секунд (старый путь).И наоборот, в комментариях ниже @roygvib получает по существу противоположный результат с gfortran 8.2.
Также обратите внимание на недавнее обсуждение этого вопроса здесь: Фортранская дискуссионная группа