Arrays 未使用的可分配阵列的内存占用

Arrays 未使用的可分配阵列的内存占用,arrays,memory-management,fortran,Arrays,Memory Management,Fortran,假设我们有一个包含10000个派生类型的数组,定义为: TYPE type1 integer :: i real, dimension(:), allocatable :: real_array END TYPE1 及 现在,我们在主程序中有以下语句: DO j=1,10 allocate(big_array(j)%real_array(100)) END DO 从big_array的组件11到组件1000,real_array是可分配的,但没有分配,因为我不需要它。

假设我们有一个包含10000个派生类型的数组,定义为:

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

现在,我们在主程序中有以下语句:

DO j=1,10
    allocate(big_array(j)%real_array(100))
END DO
big_array
的组件11到组件1000,
real_array
是可分配的,但没有分配,因为我不需要它。(我以前十个组件为例,但它可以是任何下标)


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

这根本不是问题

可分配阵列组件
real\u array
完全单独存储在内存中的“随机”位置

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


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

派生类型的实例没有任何存储关联,每个实例占用的未指定存储单元在每种情况下都不同。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
这样做有很多缺点。如果任何其他派生类型出现在这样的定义中,它们也必须是序列类型,不允许使用类型绑定过程或
指针
组件

结果是,声明为序列类型的变量没有
可分配的
组件可以出现在
等价
语句和可怕的
公共
块中

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

如果我理解正确,通过声明
type1
的显式形状
big\u array
,我创建了
real\u array
的1000个指针/描述符(我同意可以忽略的千字节,但它们都存在)但是除了前十个指针指向
allocate
语句指定的已分配内存空间外,这些指针没有被引用,对吗?是的,你是对的,描述符在那里,但它们被标记为未分配/不指向任何地方。最后,更具体地说,关于“随机”存储的第一部分,您的意思是每个
real\u数组
的组件都是非连续存储的吗?通过声明显式形状数组
big_数组
,它的组件是否连续存储?每个
real_数组
本身都是连续的,但是每个
big_数组(j)%real_数组
从一个随机位置开始,因此
real_数组
的整个集合不是连续的。
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