Arrays 将数组传递给子例程
当我将一个数组传递给一个子例程时,它是移动整个数组还是只移动指向内存路径的指针? 我的问题是:Arrays 将数组传递给子例程,arrays,pointers,fortran,subroutine,Arrays,Pointers,Fortran,Subroutine,当我将一个数组传递给一个子例程时,它是移动整个数组还是只移动指向内存路径的指针? 我的问题是: program run real,dimension :: p(200,200,200) integer :: i do i=0,10000000 call sub_p(p) enddo end subroutine sub_p(rhs) real,dimension :: rhs(200,200,200) ... end 因为如果整个数组被传
program run
real,dimension :: p(200,200,200)
integer :: i
do i=0,10000000
call sub_p(p)
enddo
end
subroutine sub_p(rhs)
real,dimension :: rhs(200,200,200)
...
end
因为如果整个数组被传递,它可能需要更长的运行时间
@弗拉基米尔:
因此,在上面的代码中,会传递一个指针,但如果代码看起来像以下内容,则会复制数组:
program run
real,dimension :: p(200,200,200)
integer,parameter :: imax = 198
integer,parameter :: jmax = 198
integer,parameter :: kmax = 198
integer :: ib,ie,jb,je,kb,ke
integer :: i
ib=1; ie=ib+imax
jb=1; je=jb+jmax
kb=1; ke=kb+kmax
do i=0,10000000
call sub_p(p(ib:ie,jb:je,kb:ke))
enddo
end
subroutine sub_p(rhs)
integer,parameter :: imax = 198
integer,parameter :: jmax = 198
integer,parameter :: kmax = 198
real,dimension :: rhs(imax,jmax,kmax)
...
end
我说的对吗?是的,如果接口是隐式的,或者伪参数是一个显式的形状数组,正如您所做的那样,将传递一个指针。(标准没有明确说明这一点,但实际上这是唯一可能的实现 但是它可以是一个指向副本的指针!如果数组不连续并且接口是隐式的,那么将有一个副本 就你而言: 无副本:
call sub_p(p)
所需副本:
call similar_sub(p(1,:,:))
这部分取决于子例程的定义方式。[例如,伪参数是否具有
值
属性。]@francescalus代码是用F90标准编写的,甚至有值选项吗?在F90或95中没有,但从2003年开始默认情况下,fortran通过引用传递参数。因此,在您的情况下,没有副本。@chi86您可以通过附加一个选项(如-fcheck array temporaries或-fcheck=array temps)来确认是否创建了副本(对于gfortran)。我想ifort也会有类似的选项。好吧,我明白了。我在我的问题中添加了另一个示例。你能看一下吗?是的,另一个示例需要一份副本。