[J3] Changing address of an allocatable on assignment when shapes match
Steve Lionel
steve at stevelionel.com
Fri Aug 23 17:59:07 EDT 2019
In
https://stackoverflow.com/questions/57606191/memory-location-of-fortran-allocatable-arrays-on-assigment
a user asks when the storage location of an allocatable array can change
during intrinsic assignment. I responded that if the shapes (or lengths,
or in the case of polymorphic, kinds) don't match, the variable is
deallocated and then reallocated to match the expression. But if
everything matches, is it conforming to do a reallocation anyway?
According to the user, Sun/Oracle Fortran Studio 12.6 (this may not be a
current version) does the reallocate even if the shapes match (but
doesn't in assignment to S(:). I could imagine that an implementor might
do this to avoid copying data twice in case of an overlap, but it feels
wrong to me. Other compilers I tried don't reallocate under these
conditions. Also, the user reports that adding the TARGET attribute
disables the reallocation.
What are people's thoughts on this - is it ok by the standard, even if a
bit weird?
Steve
program test
implicit none
real, dimension(:), allocatable :: S
integer :: i, idx(7) = [1,3,5,7,2,4,6]
allocate(S(size(idx)))
do i=1,size(S)
S(i) = i*i
end do
write(6,*) S
write(6,*) loc(S)
S = S(idx)
write(6,*) S
write(6,*) loc(S)
S(:) = S(idx)
write(6,*) S
write(6,*) loc(S)
deallocate(S)
end program
$ sunf90 -V
f90: Studio 12.6 Fortran 95 8.8 Linux_i386 2017/05/30
$ sunf90 test.f90 ; ./a.out
1.0 4.0 9.0 16.0 25.0 36.0 49.0
37518752
1.0 9.0 25.0 49.0 4.0 16.0 36.0
37519840
1.0 25.0 4.0 36.0 9.0 49.0 16.0
37519840
More information about the J3
mailing list