2017-05-14 11 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で終了します。赤は両方ともMyObjectsomearrayにあり、無駄です。

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

または私は新しい配列に割り当てることなく、メインプログラムで直接それを参照する場合:

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

私はするつもりですが、私は直接、別のサブルーチンにget_array1の結果を渡す場合最終的にarray1の倍数のコピーがメモリに保存されますか?または、関数の戻り値を含むメモリーは、サブルーチン呼び出しまたは合計後に解放されますか?

+0

一時的な配列が作成されるかどうか、またはそれが必要以上に長生きするかどうかを確認していますか? – francescalus

+0

ごめんなさい。私は一時的な配列が必要以上に長く生きるかどうか尋ねています。 – quixedjetr

答えて

1

確かにsumがintrisic、SOEのコンパイラはそれを最適化することができるかもしれであるが、一般的に、一時的には可能性があるので、一時は

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

内のアレイ製品用に作成されることは本当に可能性があります。

このような一時的なデータは、コールサイトで作成され、コール後に破棄されます。コンパイラ、設定、配列の大きさに応じて、スタックまたはヒープに配置することができます。

コール後にアレイが長時間存続することは心配しないでください。