主题:这样用指针数组开辟一个上三角矩阵为什么会浪费很多内存?
源代码如下,程序是通的:
要实现的是开辟一个类似上三角矩阵,即每行维数可变。(下面为了比较内存消耗,每行均开辟10)
program main
type :: CC
complex,dimension(:),pointer::C
end type
type(CC),allocatable :: BlockM(:)
complex,allocatable:: BlockR(:,:)
integer i,s
s=1
if(s==0)then !第一种方式:按照自定义类型数组开辟
allocate( BlockM(500000) )
do i=1,500000
allocate( BlockM(i)%C(1:10) )
enddo
else !第二种方式:按照普通二维数组开辟
allocate(BlockR(500000,10))
endif
pause
end program
查看任务管理器,这种方式的内存消耗比下面一种方式浪费了一倍。
我分析原因应该在于,上面一种方式中,allocate操作次数太多,这样大量的内存会浪费在动态数组的头上。
但是我又必须这样开辟,因为在后面的计算中数组每行的大小需要变化。
该如何解决这个问题呢?或者有什么其他的方式能实现这个目的又不浪费内存呢?
谢谢!
要实现的是开辟一个类似上三角矩阵,即每行维数可变。(下面为了比较内存消耗,每行均开辟10)
program main
type :: CC
complex,dimension(:),pointer::C
end type
type(CC),allocatable :: BlockM(:)
complex,allocatable:: BlockR(:,:)
integer i,s
s=1
if(s==0)then !第一种方式:按照自定义类型数组开辟
allocate( BlockM(500000) )
do i=1,500000
allocate( BlockM(i)%C(1:10) )
enddo
else !第二种方式:按照普通二维数组开辟
allocate(BlockR(500000,10))
endif
pause
end program
查看任务管理器,这种方式的内存消耗比下面一种方式浪费了一倍。
我分析原因应该在于,上面一种方式中,allocate操作次数太多,这样大量的内存会浪费在动态数组的头上。
但是我又必须这样开辟,因为在后面的计算中数组每行的大小需要变化。
该如何解决这个问题呢?或者有什么其他的方式能实现这个目的又不浪费内存呢?
谢谢!