如果我有像这样的循环
#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
?我们可以假设temp
和input
的大小没有变化。如果我在循环中没有子例程而是内联代码,则必须在更高位置定义此数组,并且不必在每次循环迭代时重新分配该数组。编译器会意识到这一点吗?是否取决于优化级别/编译器?
答案 0 :(得分:4)
是的,将在每次调用时分配该数组。但是,如果它是在堆栈上分配的,则分配实际上是空闲的(只是更新堆栈指针)。除非您指定编译器和版本,否则永远无法确定编译器的优化,但是我不知道像这样的任何优化,那会非常复杂。而且我们还必须知道数组的大小,以及编译器是在堆栈上分配还是在堆上分配。
如果子例程是内部例程,则可以向上分配数组。您也可以将其分配更高,并将其作为参数传递。但只有在确实带来任何好处的情况下,才这样做。如果它是一个很小的堆栈数组,那么将不会有太大的成就。