gpt4 book ai didi

fortran - 在具有多级分配的 Fortran 中使用锯齿数组有什么问题吗?

转载 作者:行者123 更新时间:2023-12-04 18:45:47 24 4
gpt4 key购买 nike

在我的 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(:),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

    关于fortran - 在具有多级分配的 Fortran 中使用锯齿数组有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857366/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com