1

optional引数を扱うときは、組み込みfortranを使用して分岐するのが一般的だと思います。present()

subroutine foo(ii,jj)
    implicit none
    integer, intent(in) :: ii
    integer, optional   :: jj

    if (present(jj)) then
! do something
    else
! do something else
    end if

end subroutine foo

C++(世界からの)私の仮定は、present()うまくいけばコンパイル時の構成であり、関連する実行時のパフォーマンスの低下はないということです。またはが呼び出されるifかどうかに応じて、コンパイラが上記のステートメントを最適化できる (必要なのか?) はずです。foo(ii)foo(ii,jj)

present()組み込みはコンパイラによって実際にどのように処理されますか? fortran仕様は特定の動作を保証しますか?

4

3 に答える 3

1

それは場合によります (他に何を期待していましたか? :-)

最近のバージョンで gfortran を使用し、少なくとも 1 つのブランチで多くの作業を行い、LTO を使用するか、すべてを 1 つのファイルに入れる場合、コンパイラは関数を (定数伝播を介して) 複製します。そうでなければ、おそらくそうではありません。プロシージャが複製されているかどうかを確認するには、アセンブリ ファイルfooで grep を実行します。foo.*constprop

于 2015-02-22T14:56:21.837 に答える