Arrays 未使用的可分配阵列的内存占用
假设我们有一个包含10000个派生类型的数组,定义为: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是可分配的,但没有分配,因为我不需要它。
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