fortran66のブログ

fortran について書きます。

【メモ帳】Fortran の value 属性

call by value !?

Fortran の副プログラムの引数は、call by reference がデフォルトですが、Fortran 2003 で引数に value 属性が加わり、call by value 型の扱いも出来るようになりました。特に副プログラムに bind(c) の属性もつけてやることで、C 言語との互換もとれるようになりました。

ここで bind(c) を付けなかった場合に、value 属性の引数がどうなるのか気になる所です。Dr. Fortran こと Steve Lionel のコラムによると、intel fortran では呼び出し側でコピーを取って、そのコピーを call by referecnce で渡すそうです。これは FORTRAN 77 時代のテクニックで式を実引数にすると、その結果をテンポラリにコピーしてそれを call by reference で渡すのと同じになっています。次のようなものがその例になります。

call sub((3))

stevelionel.com

stevelionel.com

ところが、compiler explorer を見ると gfortran では value 属性の引数は bind(c) したときと同じように値を送っているように見えます。

もう少し詳しく調べてみたいところですが、とりあえず色々あるんだなとメモっておくことにします。

godbolt.org

    module test_m
        implicit none
    contains
        subroutine sub1(x)
            real, intent(in) :: x
            print *, loc(x) ! non-standard
        end subroutine sub1

        subroutine sub2(x)
            real, value :: x
            print *, loc(x) ! non-standard
        end subroutine sub2

        subroutine sub3(x) bind(c)
            real, value :: x
            print *, loc(x) ! non-standard
        end subroutine sub3
    
    end module test_m
    
    
    
    program test01
        use test_m
        implicit none
            real :: stack
            
            stack = 1.0
            call sub1(stack)
            call sub1((stack))

            call sub2(stack)
            call sub3(stack)
    end program test01