在Fortran中使用多级分配的交错数组有什么问题吗?
在我的Fortran代码中,我希望使用具有多级分配的交错数组。我的意思的一个示例代码是在Fortran中使用多级分配的交错数组有什么问题吗?,fortran,allocation,jagged-arrays,Fortran,Allocation,Jagged Arrays,在我的Fortran代码中,我希望使用具有多级分配的交错数组。我的意思的一个示例代码是 module nonsquare_matrix_mod implicit none type :: nonsquare_matrix integer :: d real*8, dimension(:), allocatable :: vector end type nonsquare_matrix type(nonsquare_matrix),dimension
module nonsquare_matrix_mod
implicit none
type :: nonsquare_matrix
integer :: d
real*8, dimension(:), allocatable :: vector
end type nonsquare_matrix
type(nonsquare_matrix),dimension(:),allocatable :: mymatrix
end module nonsquare_matrix_mod
program nonsquare_matrix_test
use nonsquare_matrix_mod
implicit none
integer, parameter :: max_size=50
integer :: i
allocate(mymatrix(max_size))
do i=1,max_size
allocate(mymatrix(i) % vector(i))
end do
print *, "allocated"
end program
为了节省内存,我想实现这个编程策略。我知道这个示例中保存的内存不是太大,但对于我的实际项目,我使用的是更大的数据结构。我想知道这种编程实践是否有任何危险,比如数据没有连续存储或者更容易发生内存泄漏。或者这是一种没有很多缺点的节省内存的有效方法?谢谢。因为您只使用可分配数组,所以不会出现任何内存泄漏,因为使用指针时可能会出现这种情况。锯齿阵列是否是解决问题的合理方案在很大程度上取决于数据的结构。需要注意的几点:
- 你的阵型不会是连续的。当您访问后续行时,这有几个含义,比如更糟糕的缓存行为
- 您必须通过
单独分配每一行。如果这种情况经常发生(例如在循环中),那可能是个问题,因为分配是一个相当“缓慢”的操作allocate
- 如果数组中的行大小确实非常不同(并且没有太多的行),则可以节省大量内存
program nonsquare_matrix_test
implicit none
integer, parameter :: dp = kind(1.0d0)
integer, parameter :: maxlines = 50
integer, parameter :: maxelements = 5000
real(dp), allocatable :: buffer(:)
integer, allocatable :: rowindex(:)
integer :: ii
allocate(buffer(maxelements))
allocate(rowindex(maxlines + 1))
rowindex(1) = 1
do ii = 1, maxlines
rowindex(ii + 1) = rowindex(ii) + ii
end do
! ...
! Omitting the part which fills up the array
! ...
! Accessing a given line (e.g. line 5)
print *, "Content of line 5:"
print *, buffer(rowindex(5):rowindex(6)-1)
end program nonsquare_matrix_test
看起来不错,我以前也用过这种方法。节省的内存量取决于阵列之间的阵列长度变化。最好的方法是首先编写对您来说最直观的代码。只要您远离指针,我就不会担心内存泄漏。