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

问题描述 投票:3回答:1

如果我有一个像循环

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的大小没有变化。如果我没有子程序而是循环中的内联代码,则必须将此数组定义得更高,并且不会在每次循环迭代时重新分配。编译器会意识到这一点吗?它取决于优化级别/编译器吗?

fortran gfortran
1个回答
4
投票

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

如果子例程是内部的,则可以将数组分配得更高。您也可以将其分配得更高并将其作为参数传递。但只有这样才能真正带来任何东西。如果它是一个相当小的堆栈数组,它将无法实现太多。

© www.soinside.com 2019 - 2024. All rights reserved.