1

非常に大きな配列があるとしましょうverybigvariable

そして、私はこのようないくつかの操作を行う関数を定義しました

function myfunc(var) result(res)
real:: var(:,:,:),res

...
...
...

end function myfunc

私の質問は、この関数をこのように呼び出すと

myvar=myfunc(verybigvariable)

何が起こるのですか?関数の実行中にRAMに2Xのスペースを保持するように、変数を複製しますか?もしそうなら、どうすればこれを防ぐことができますか?(単純なプログラムでは、パラメーターなしで関数を定義し、既存の変数を使用させることができますが、モジュールをプログラミングしている場合は、定義にパラメーターを含める必要があるようです)

4

2 に答える 2

7

Fortran言語標準は、引数の受け渡し方法を指定していません。通常、効率を上げるために、コンパイラはコピーを作成せず、引数のアドレスを渡します。Fortranコンパイラがコピーを作成しなければならない場合があります。たとえば、実際の引数は非連続配列ですが、プロシージャは連続引数を想定しています。コンパイラーは、プロシージャーに渡すために連続したコピーを作成することにより、不一致を修正する必要があります。プロシージャがその引数を変更する場合は、値を元の引数にコピーして戻す必要があります。

于 2013-03-24T15:01:05.287 に答える
0

fortranでは、パラメータは参照によって渡されるようですこれは、変数のアドレスのみが渡され、関数がそのアドレスを介して変数にアクセスできることを意味します。

したがって、配列はコピーされず、配列のアドレスのみが渡されます。このオーバーヘッドは、32ビットシステムの場合は32ビット、64ビットシステムの場合は64ビットになります。

私はFortranの経験がなく、これはGoogle検索でしか理解できなかったので、Fortranプログラマーにコメントがあれば、遠慮なく編集/コメントしてください。

于 2013-03-24T14:59:01.497 に答える