在Fortran中,切片数组是否会在内存中创建副本?

bfl*_*tch 5 fortran slice fortran90

假设我将一个数组切片传递给一个操作其输入的子程序:

some_subroutine(a(:,1))
Run Code Online (Sandbox Code Playgroud)

该部分的原件是否被a更改,或者是一些a(:,1)改变的副本?

fra*_*lus 5

还有其他几个答案,可能会解决略有不同(但相关)的问题.在这里,我将尝试调和它们.

弗拉基米尔F的答案着眼于所谓的复制/复制机制; bfletch回答了对论证的最终影响.

一般来说,效果如下

integer i(2,2)
i=0
call dosomething(i(1,:))   ! Just to make it not contiguous.

contains
  subroutine dosomething(j)
    integer j(2)  ! or j(*), or j(:)
    j=1
  end subroutine
end program
Run Code Online (Sandbox Code Playgroud)

是数组i有一些元素设置1和其他元素0.所以,是的:无论是否有临时副本(从一个答案),在调用之后可以观察到的是它是被修改的实际参数本身.

当然,有一个例外:value属性.1如果上面的子程序是相反的

subroutine doseomthing(j)
  integer, value :: j(2)
  j=1
end subroutine
Run Code Online (Sandbox Code Playgroud)

那确实是论证的真实副本.对伪参数的修改j不会反映在实际参数的部分中i.


1这是针对当前的Fortran.被标记的Fortran 90没有此功能.