12

Я пишу новый код в Fortran и колеблюсь между использованием выделяемых массивов или указательных массивов. Я где-то читал, что массивы имеют быть выделены значительные преимущества по сравнению с массивами указателей:АВАРИЙНЫЕ массивы или массивы POINTER?

1) более эффективны, поскольку они всегда соприкасаются в памяти

2) Нет утечек памяти не возможны

Может кто-то подтвердить это? Какой из них вы бы посоветовали использовать? Каковы результаты с точки зрения скорости выполнения кода между этими двумя альтернативами?

+0

Почему вы не можете потерять память? Разве вам не нужно «DEALLOCATE» любой массив, который вы создали с помощью 'allocatable'? –

+0

@Carl - вы имеете в виду «распределить» ... – Rook

ответ

20

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

Для локальных переменных в подпрограммах (без атрибута SAVE) (для Fortran 95 и выше) распределяемые массивы автоматически освобождаются после выхода из подпрограммы, избегая утечки памяти. Утечки памяти невозможны с allocatables, за исключением того, что программист не освобождает массив, который больше не нужен.

С указателями вы можете переназначить указатель, оставив недоступную и потерянную память - одну из форм утечки. Если allocatable выполнит задание, я рекомендую использовать этот метод вместо указателя.

Некоторые причины использования указателей: выбор участка массива или создание структуры данных, например связанного списка. Для создания массива размера, определенного во время выполнения, я бы использовал allocatable.

+0

Большое спасибо за это очень четкое объяснение! – remek

+2

Обновление: с помощью Fortran 2008 можно создавать связанные списки, используя выделяемые переменные вместо указателей. См. П. 5.3 ftp://ftp.nag.co.uk/sc22wg5/N1701-N1750/N1729.pdf –

Смежные вопросы