У цій вибірковій програмі я роблю те саме (принаймні я так думаю) двома різними способами. Я запускаю це на своєму ПК на ПК та відстежую використання пам'яті зверху. Використовуючи gfortran, я вважаю, що в першому способі (між "1" і "2") використовувана пам'ять становить 8,2 ГБ, тоді як у другому (між "2" і "3") використання пам'яті становить 3,0 ГБ. У компіляторі Intel різниця ще більша: 10 ГБ проти 3 ГБ. Це здається надмірним покаранням за використання покажчиків. Чому це відбувається?
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
Фон - локальне вдосконалення сітки. Я вибрав пов'язаний список, щоб легко додавати та видаляти обличчя. Кількість вузлів за замовчуванням становить 4, але вони можуть бути вищими, залежно від місцевих уточнень.