子例程中的临时数组会在每次调用时重新分配吗?

时间:2019-04-11 15:09:01

标签: fortran gfortran

如果我有像这样的循环

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstdlib>
#include <conio.h>
using namespace std;
int main()
{
    gotoxy(20, 30);
}

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

1 个答案:

答案 0 :(得分:4)

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

如果子例程是内部例程,则可以向上分配数组。您也可以将其分配更高,并将其作为参数传递。但只有在确实带来任何好处的情况下,才这样做。如果它是一个很小的堆栈数组,那么将不会有太大的成就。