gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:07:01 24 4
gpt4 key购买 nike

如果我有一个像这样的循环

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 - 子程序中的临时数组是否会在每次调用时重新分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55635792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com