In diesem Beispielprogramm mache ich dasselbe (zumindest denke ich das) auf zwei verschiedene Arten. Ich führe dies auf meinem Linux-PC aus und überwache die Speichernutzung mit top. Bei der Verwendung von gfortran stelle ich fest, dass auf die erste Weise (zwischen "1" und "2") der verwendete Speicher 8,2 GB beträgt, während auf die zweite Weise (zwischen "2" und "3") die Speichernutzung 3,0 GB beträgt. Beim Intel-Compiler ist der Unterschied sogar noch größer: 10 GB gegenüber 3 GB. Dies scheint eine übermäßige Strafe für die Verwendung von Zeigern zu sein. Warum passiert das?
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
Hintergrund ist die lokale Netzverfeinerung. Ich habe die verknüpfte Liste ausgewählt, um Gesichter einfach hinzuzufügen und zu entfernen. Die Anzahl der Knoten ist standardmäßig 4, kann jedoch abhängig von den lokalen Verfeinerungen höher werden.