Будут ли временные массивы в подпрограммах перераспределяться при каждом вызове? - PullRequest
3 голосов
/ 11 апреля 2019

Если у меня есть цикл, подобный

do i = 1,much
  call computations(input(i,:),output(i,:))
enddo

и

subroutine computations(inn,outt)
real, intent(in) :: inn(:)
real, intent(out) :: outt(:)
real :: temp(size(inn))
...
end subroutine

, будет ли массив temp выделяться и освобождаться при каждом вызове?Можно предположить, что размеры input и output не меняются.Если бы у меня не было подпрограммы, а был бы встроенный код в цикле, то этот массив должен был бы быть определен выше, и его нельзя было бы перераспределять на каждой итерации цикла.Осознает ли это компилятор?Зависит ли это от уровня оптимизации / компилятора?

1 Ответ

4 голосов
/ 11 апреля 2019

Да, массив будет выделяться при каждом вызове. Тем не менее, если он размещен в стеке, распределение по существу бесплатное (просто обновление указателя стека). Никогда нельзя быть уверенным в оптимизации компилятора, если вы не укажете компилятор и версию, но я не знаю ни о какой подобной оптимизации, это было бы очень сложно. А также нам нужно знать размер массива и то, будет ли компилятор размещаться в стеке или в куче.

Если подпрограмма внутренняя, вы можете разместить массив выше. Вы также можете выделить его выше и передать в качестве аргумента. Но делайте это только в том случае, если это действительно что-то приносит. Если это довольно небольшой массив стеков, он не достиг бы многого.

...