我有个1维工作阵列传递数组给需要不同形状的子程序
real(8), allocatable :: work(:)
其被传递到一个2维阵列
pure subroutine f(work, dim1, dim2)
real(8), intent(out) :: work(dim1, dim2)
integer, intent(in) :: dim1, dim2
...
上操作的子例程以下传递数组的方式有何区别?
call f(work, dim1, dim2)
call f(work(1), dim1, dim2)
他们是在同他们只是指针传递给第一个数组元素或者是有一些额外的开销或者调用?现代Fortran中是否有更优雅的方式传递一个数组,其形状需要改变,而不明确传递维度,但不会影响性能?
我知道上面看起来像旧的Fortran,但我发现它比宣布父子程序二维阵列和传递一个数组部分,work(:dim1,:dim2)
,到f
更快。
在某种意义上,这里有两个完全不同的问题。 [1]](http://stackoverflow.com/q/25000321)'work'和'work(1)'.as参数有什么区别? [2]](http://stackoverflow.com/q/24472907)如何将一个与哑元相关联的形状数组作为另一个形状? – francescalus
对于你的最后一点,如果'work'是一个rank-2数组,那么如果你将'work'作为一个整体数组而不是数组部分'work(:dim1,:dim2)',那么会发生什么? – francescalus
谢谢。在子程序内部,我正在做一些事情,比如用'work(:dim1,:dim2)'调用'dgemm''作为参数之一。如果在调用作用域中将'work'声明为二维数组并且传递了完整数组,则这将导致自动创建一个临时数组。重点是每个调用的维度可能不同,但我只分配一次工作空间。 –