子程序中的临时数组是否会在每次调用时重新分配?

Will temporary arrays in subroutines be reallocated on each call?

如果我有一个像

这样的循环
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?我们可以假设 inputoutput 的大小没有改变。如果我没有子例程而是循环中的内联代码,那么这个数组必须定义得更高,并且不会在每次循环迭代时重新分配。编译器会意识到这一点吗?是否依赖于优化level/compiler?

是的,数组将在每次调用时分配。但是,如果它是在堆栈上分配的,则分配基本上是免费的(只是更新堆栈指针)。除非您指定编译器和版本,否则永远无法确定编译器优化,但我不知道有任何像这样的优化,那会非常复杂。而且我们还必须知道数组的大小以及编译器是在堆栈上还是在堆上分配。

如果子程序是内部的,你可以将数组分配到更高的位置。您也可以将它分配到更高的位置并将其作为参数传递。但只有在它真的带来任何好处时才这样做。如果它是一个相当小的堆栈数组,它不会有太大的成就。