だけど、functionに関してはどうなのだろう?というのも、function内でallocateして配列を返すようなものを結構書いていたから。fortran95からはスコープから外れるとメモリを解放してくれることになっているので、deallocateなどしていない。
ということで、試してみた。
program test_allocate
implicit none
integer, parameter :: n = 1000000
integer :: array1(n)
integer, allocatable :: array2(:)
array1(1:n) = 1
! function
array1 = allocate_array(n)
print *, loc(array1)
! subroutine
call allocate_array_sub(n, array2)
print *, loc(array2)
stop
contains
subroutine allocate_array_sub(n, array)
integer, intent(in) :: n
integer, allocatable, intent(out) :: array(:)
allocate(array(n))
array(1:n) = 1
print *, loc(array)
return
end subroutine allocate_array_sub
function allocate_array(n) result(array)
integer, intent(in) :: n
integer, allocatable :: array(:)
allocate(array(n))
array(1:n) = 1
print *, loc(array)
return
end function allocate_array
end program test_allocate
すると、こんな結果に。
140120599949328 ! function内でallocate
6299808 ! functionの外
39948288 ! subroutine内でallocate
39948288 ! subroutineの外
ということで、試したのはgfortranだけれども、function内でallocateした配列は値のコピーが返り、subroutineから返る配列は参照渡しで返るみたいだ。本当に言語仕様なのかはよく分からない。
0 件のコメント:
コメントを投稿