Trong chương trình mẫu này, tôi đang làm điều tương tự (ít nhất là tôi nghĩ vậy) theo hai cách khác nhau. Tôi đang chạy cái này trên máy tính Linux của tôi và theo dõi việc sử dụng bộ nhớ hàng đầu. Sử dụng gfortran tôi thấy rằng theo cách thứ nhất (giữa "1" và "2") bộ nhớ được sử dụng là 8.2GB, trong khi ở cách thứ hai (giữa "2" và "3"), mức sử dụng bộ nhớ là 3.0GB. Với trình biên dịch Intel, sự khác biệt thậm chí còn lớn hơn: 10 GB so với 3 GB. Điều này có vẻ như một hình phạt quá mức cho việc sử dụng con trỏ. Lý do tại sao điều này xảy ra?
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
Nền là sàng lọc lưới địa phương. Tôi đã chọn danh sách liên kết để dễ dàng thêm và xóa khuôn mặt. Số lượng nút là 4 theo mặc định nhưng có thể trở nên cao hơn tùy thuộc vào các sàng lọc cục bộ.