我有個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'聲明爲二維數組並且傳遞了完整數組,則這將導致自動創建一個臨時數組。重點是每個調用的維度可能不同,但我只分配一次工作空間。 –