2011-12-02 24 views
1

我從來沒有想過這之前,但最近我一直在擔心着什麼。在FORTRAN90(95),說我創建了一個真正的大陣列當我將一個數組傳遞給一個函數/子程序時會發生什麼?

Integer :: X(1000000) 

,然後我寫一個函數,這個數組作爲參數。當我數組傳遞給函數(如myfunc(X))什麼在運行時到底會發生?

是否整個數組得到由值和函數內構建一個新的副本通過呢? (昂貴)
抑或編譯器簡單地通過某種引用或指針數組? (便宜)

數組的維度或函數的聲明有什麼不同嗎?

回答

2

在Fortran 90中,因爲在大多數其他編程語言,數組是通過引用傳遞(在技術上,這常常是到所述陣列的所述第一項的引用)。在Fortran 90中,非數組值通常也通過引用傳遞。所以,你不必擔心你傳遞的參數的大小,因爲它們不會被複制,而是會被簡單地通過引用傳遞。

1

你不想做的一件事情是這樣的:

INTEGER :: X(1:1000,1:1000,1:1000) 
CALL myRoutine(X(2:999,2:999,2:999)) 

其中myRoutine不能在陣列一些情理之中運行。它不能將引用傳遞給數組的切片,因爲它在內存中不連續。所以它創建一個臨時數組並且複製X的值。不用說這很慢。但是,即使在指定切片時,您也不應該遇到1D數組的問題,因爲它們在內存中仍然是連續的。

相關問題