W tym przykładowym programie robię to samo (przynajmniej tak mi się wydaje) na dwa różne sposoby. Korzystam z tego na komputerze z systemem Linux i monitoruję użycie pamięci za pomocą top. Korzystając z gfortran, stwierdzam, że w pierwszy sposób (między „1” a „2”) używana pamięć wynosi 8,2 GB, podczas gdy w drugim sposobie (między „2” i „3”) zużycie pamięci wynosi 3,0 GB. W przypadku kompilatora Intel różnica jest jeszcze większa: 10 GB w porównaniu do 3 GB. Wydaje się to nadmierną karą za używanie wskaźników. Dlaczego to się dzieje?
program test
implicit none
type nodesType
integer:: nnodes
integer,dimension(:),pointer:: nodes
end type nodesType
type nodesType2
integer:: nnodes
integer,dimension(4):: nodes
end type nodesType2
type(nodesType),dimension(:),allocatable:: FaceList
type(nodesType2),dimension(:),allocatable:: FaceList2
integer:: n,i
n = 100000000
print *, '1'
read(*,*)
allocate(FaceList(n))
do i=1,n
FaceList(i)%nnodes = 4
allocate(FaceList(i)%nodes(4))
FaceList(i)%nodes(1:4) = (/1,2,3,4/)
end do
print *, '2'
read(*,*)
do i=1,n
deallocate(FaceList(i)%nodes)
end do
deallocate(FaceList)
allocate(FaceList2(n))
do i=1,n
FaceList2(i)%nnodes = 4
FaceList2(i)%nodes(1:4) = (/1,2,3,4/)
end do
print *, '3'
read(*,*)
end program test
Tłem jest lokalne udoskonalenie sieci. Wybrałem połączoną listę, aby łatwo dodawać i usuwać twarze. Domyślnie liczba węzłów wynosi 4, ale może wzrosnąć w zależności od lokalnych ulepszeń.