假设我们有一个由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
是可分配的但未分配,因为我不需要它。 (我将前十个组件作为示例,但它可以是任何下标)
在内存使用/管理/效率方面是否存在问题? “未使用/未分配的可分配阵列”的内存占用量是多少?
答案 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