Bu örnek programda aynı şeyi (en azından öyle düşünüyorum) iki farklı şekilde yapıyorum. Bunu Linux bilgisayarımda çalıştırıyorum ve üstte bellek kullanımını izliyorum. Gfortran kullanarak, birinci şekilde ("1" ve "2" arasında) kullanılan belleğin 8.2GB, ikinci şekilde ("2" ve "3" arasında) bellek kullanımının 3.0GB olduğunu düşünüyorum. Intel derleyici ile fark daha da büyük: 10GB ve 3GB. Bu, işaretçileri kullanmak için aşırı bir ceza gibi görünüyor. Bu neden oluyor?
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
Arka plan yerel ızgara ayrıntılandırmasıdır. Yüzleri kolayca eklemek ve kaldırmak için bağlantılı listeyi seçtim. Düğüm sayısı varsayılan olarak 4'tür, ancak yerel ayrıntılandırmalara bağlı olarak daha yüksek olabilir.