2016-06-10 70 views
1

假设我们定义为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 

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

这是内存使用情况/管理/效率问题吗? “未使用/未分配的可分配数组”的内存占用是多少?

回答

2

这根本不是问题。

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

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

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

+0

如果我理解正确的话,通过声明明确形'big_array' type1'的',我创建1000个三分球/ real_array'的'描述符(可忽略千字节我同意,但是他们都存在),但这些指针不除了前10个指向由'allocate'语句指定的分配内存空间之外的引用,我正确吗? – Coriolis

+0

是的,你是正确的,描述符在那里,但它们被标记为未分配/不指向任何地方。 –

+0

最后,关于“随机”存储的答案的第一部分更具体一点,你的意思是说,每个“real_array”的组件都是非连续存储的?通过声明显式形状数组big_array,它的组件是否连续存储? – Coriolis

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 

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

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