将数组传递给子例程

Passing an array to a 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,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,:,:))