2017-05-14 67 views
0

比方說,我有一個包含一些大型陣列重複記憶Fortran中使用「吸氣」功能時

type, public :: MyObject 
    implicit none 
    real*8, allocatable, private :: array1, array2, ... etc 
contains 
    procedure :: get_array1, get_array2, ... etc 
end type MyObject 

以及的對象「吸氣」功能

function get_array1(self) result(array1) 
    implicit none 
    class(MyObject), intent(in) :: self 
    real, dimension(size(self%array1)) :: array1 

    array1 = self%array1 
end function get_array1 

如果我使用在程序中的吸氣功能如下

somearray = MyObject%get_array1() 

然後我將以array1的值結束sto紅色在MyObjectsomearray,這是浪費。然而,如果我直接傳遞的get_array1結果到另一個子程序:

call a_subroutine(arg1, arg2, MyObject%get_array1()) 

,或者如果我指的是它直接在主程序中沒有將其分配給一個新的數組:

a_sum = sum(a_vector(:)*MyObject%get_array1()) 

我該怎麼最終存儲在內存中的array1的多個副本?或者在子程序調用或求和之後,包含函數返回值的內存是否被釋放?

+0

你問是否創建了一個臨時數組,或者是否創建了一個臨時數組,它是否比所需的時間長? – francescalus

+0

抱歉應該更清楚了。我在問臨時陣列是否會比需要的時間更長。 – quixedjetr

回答

1

這的確是真的可能是一個臨時將爲陣列產品中

a_sum = sum(a_vector(:)*MyObject%get_array1()) 

創建,因爲sum是intrisic,SOE編譯器可能能夠優化它,但一般一個臨時的可能性較大。

這樣的臨時對象在呼叫站點創建並在通話後銷燬。根據編譯器,它的設置和數組大小,它們可以放在堆棧或堆上。

你不應該擔心陣列在通話之後活得太久。