ในโปรแกรมตัวอย่างนี้ฉันกำลังทำสิ่งเดียวกัน (อย่างน้อยฉันก็คิดอย่างนั้น) ในสองวิธีที่แตกต่างกัน ฉันใช้งานบนพีซีลีนุกซ์และตรวจสอบการใช้งานหน่วยความจำด้วยด้านบน การใช้ gfortran ฉันพบว่าในวิธีแรก (ระหว่าง "1" และ "2") หน่วยความจำที่ใช้คือ 8.2GB ในขณะที่วิธีที่สอง (ระหว่าง "2" และ "3") การใช้หน่วยความจำคือ 3.0GB ด้วยคอมไพเลอร์ของ Intel ความแตกต่างก็ยิ่งใหญ่กว่า: 10GB เทียบกับ 3GB นี่ดูเหมือนจะเป็นการลงโทษที่มากเกินไปสำหรับการใช้พอยน์เตอร์ ทำไมสิ่งนี้ถึงเกิดขึ้น
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 โดยค่าเริ่มต้น แต่อาจสูงกว่าขึ้นอยู่กับการปรับแต่งเฉพาะที่