Dalam program sampel ini saya melakukan hal yang sama (setidaknya saya pikir begitu) dengan dua cara berbeda. Saya menjalankan ini pada pc Linux saya dan memantau penggunaan memori dengan top. Menggunakan gfortran, saya menemukan bahwa dengan cara pertama (antara "1" dan "2") memori yang digunakan adalah 8.2GB, sementara di jalan kedua (antara "2" dan "3") penggunaan memori adalah 3.0GB. Dengan kompiler Intel perbedaannya bahkan lebih besar: 10GB versus 3GB. Ini sepertinya penalti yang berlebihan untuk menggunakan pointer. Mengapa ini terjadi?
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
Latar belakangnya adalah penyempurnaan grid lokal. Saya memilih daftar yang ditautkan untuk dengan mudah menambah dan menghapus wajah. Jumlah node adalah 4 secara default tetapi bisa menjadi lebih tinggi tergantung pada penyempurnaan lokal.