未使用的可分配数组的内存占用量

时间:2016-06-10 09:29:03

标签: arrays memory-management fortran

假设我们有一个由10 000个派生类型定义为:

的数组
TYPE type1
    integer :: i
    real, dimension(:), allocatable :: real_array
END TYPE1

type(type1), dimension(1000) :: big_array

现在,我们在主程序中有以下声明:

DO j=1,10
    allocate(big_array(j)%real_array(100))
END DO

big_array的组件11到组件1000,real_array是可分配的但未分配,因为我不需要它。 (我将前十个组件作为示例,但它可以是任何下标)

在内存使用/管理/效率方面是否存在问题? “未使用/未分配的可分配阵列”的内存占用量是多少?

2 个答案:

答案 0 :(得分:2)

这根本不是问题。

可分配数组组件real_array完全分别存储在内存中的“随机”位置。

big_array本身,你只有一些这些组件的描述符或指针,big_array本身的大小不是太大。你可能不应该担心几千字节。

就效率而言,问题可能是(但不是必须)组件处于随机位置,但无论big_array有多大,这都是相同的。

答案 1 :(得分:0)

派生类型的实例没有任何存储关联,每个实例占用一个在每种情况下都不同的未指定的存储单元。 Fortran标准允许编译器以任何方便的顺序在内存中重新排列派生类型的组件。但是,您可以强制将派生类型连续存储在内存中,只需使用sequence关键字

module type_MyStorage

  implicit none
  private

  type, public :: MyStorage
     sequence
     integer  :: i=0
     real     :: a(0:999)
  end type MyStorage

end module type_MyStorage

这样做有很多缺点。如果任何其他派生类型出现在这样的定义中,它们也必须是序列类型,不允许使用类型绑定过程或pointer组件。

Upshot,声明为没有allocatable组件的序列类型的变量可以出现在equivalence语句和可怕的common块中。

program main

  use type_MyStorage, only: MyStorage

  implicit none

  type (MyStorage) :: foo, bar

  equivalence (foo, bar)

  foo%i = 42
  print *, bar%i

end program main