Dans cet exemple de programme, je fais la même chose (du moins je pense) de deux manières différentes. J'exécute cela sur mon PC Linux et surveille l'utilisation de la mémoire avec top. En utilisant gfortran, je trouve que dans la première manière (entre "1" et "2") la mémoire utilisée est de 8,2 Go, tandis que dans la seconde manière (entre "2" et "3") l'utilisation de la mémoire est de 3,0 Go. Avec le compilateur Intel, la différence est encore plus grande: 10 Go contre 3 Go. Cela semble une pénalité excessive pour l'utilisation de pointeurs. Pourquoi cela arrive-t-il?
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
L'arrière-plan est le raffinement du réseau local. J'ai choisi la liste chaînée pour ajouter et supprimer facilement des visages. Le nombre de nœuds est de 4 par défaut mais peut devenir plus élevé en fonction des raffinements locaux.