В этом примере программы я делаю одно и то же (по крайней мере, мне так кажется) двумя разными способами. Я запускаю это на своем компьютере с Linux и наблюдаю за использованием памяти с помощью top. Используя 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, но может увеличиться в зависимости от локальных уточнений.