2014-06-25 55 views
-1

我的理解是,在Fortran中,數組通過引用傳遞。因此,將指針傳遞給大型數組(相對於傳遞數組本身而言)有優勢。Fortran調用:傳遞指針與傳遞參考的優點

您是否也可以在遞歸函數的上下文中闡明這一點。我見過指針用於「效率」的實現,但如果所有內容都通過引用傳遞,那麼指針的好處是什麼。

下面是一個例子。我有一個數組X(實際上可以說它是一個非常大的數組)。當我打電話上方,然後如FORTRAN傳遞給它的參考陣列X是不可複製的子程序

SUBROUTINE FOO(X) 
    INTEGER, INTENT(IN) :: X(:) 

    INTEGER :: I 

    DO I = 1, 4 
     WRITE(*,*) X(I) 
    ENDDO 
END SUBROUTINE FOO 

INTEGER :: X(:) 

我可以定義一個subrouitne負責這種陣列如下。現在可以說我有子程序的修改版本:

SUBROUTINE FOO2(X) 
    INTEGER, POINTER, INTENT(IN) :: X(:) 
    INTEGER :: I 

    DO I = 1, 4 
     WRITE(*,*) X(I) 
    ENDDO 
END SUBROUTINE FOO2 

我可以從程序中調用FOO2如下:

PROGRAM TEST 
IMPLICIT NONE 

INTEGER, TARGET :: X(5) 
INTEGER, POINTER :: Y(:) 

X = (/1,2,3,4,5/) 
Y => X 

CALL FOO2(Y) 
END PROGRAM TEST 

然後這裏是我的問題:有兩個版本之間的性能差異的foo?有沒有什麼有用的情況下,FOO2的聲明可能比FOO更好?

+1

你似乎很困惑。你是指Fortran指針變量還是地址?通過引用傳遞和傳遞指針是在機器代碼級別或C語言級別(幾乎)相同。向我們展示你們兩種方法的例子,你們的描述絕對不夠。現在投票結束。 –

+0

指針,什麼是指針?我是Fortran程序員。你是什​​麼意思*,而不是傳遞數組本身*?現在,我傾向於同意@VladimirF(我通常會這樣做),並且看不出你的問題如何可以得出很好的答案。 –

+0

@VladimirF我並不困惑,但我可以更清楚。我的意思是指針變量(我不知道在fortran中指針是什麼意思,所以我沒有看到任何混淆的原因)。我只想了解將數組X傳遞給子例程與將效率的角度向目標X聲明的指針傳遞給該子例程是否有區別。我還應該補充說,你不應該因爲你不明白要問什麼而拒絕投票問題。只是要求澄清。 – deepak

回答

1

在這種簡單的情況下,不應該有任何真正的區別。請注意,該程序是非法的,您沒有與FOOFOO2的明確界面,但我會假定您只是爲了簡單而忽略它,而且它們位於模塊或內部。

這兩個數組原則上可以不連續,因此這裏沒有區別。如果這會減慢代碼,則contiguous屬性可能會有所幫助。或者也假定大小或明確大小的數組。

你的子程序太簡單了,所以也沒有別名的危險。這是使用指針降低性能的常見原因。如果主機或使用關聯具有target屬性,則可能存在潛在的別名參數或其他變量。

指針參數的用途實際上是允許取消關聯(null())參數,或允許更改子例程中的關聯狀態。你的例子既不使用,因此指針屬性是多餘的。

有最後的小差異。在標準中沒有指定在指針變量的機器代碼級實際傳遞給子程序的內容。如果它只是一個地址(可能是標量),它與非指針相同,只是別名規則和允許的用法不同。否則,會傳遞一些描述符,但任何開銷都應忽略不計,假定的形狀數組也使用描述符。