派生类型数组存储在相同的列 - 主要顺序。
您可能想知道单个组件在哪里存储。它们与数组元素地址的偏移量未指定,顺序可能与声明顺序不同,并且它们之间可能存在各种间隔。但是,一旦建立了偏移量的值(通过调用loc()
或c_loc()
),对于该类型的所有实例而言,不管该数组是在其他位置还是在其他位置。
因此,组件的顺序可以
A(1,1)%i,optional_padding,A(1,1)%j,optional_padding,A(2,1)%i,optional_padding,A(2,1)%j,optional_padding,...
而且
A(1,1)%j,optional_padding,A(1,1)%i,optional_padding,A(2,1)%j,optional_padding,A(2,1)%i,optional_padding,...
通过定义类型为使用
type :: innerdata
sequence
integer :: i
real :: j
end type innerdata
可以强制序列sequence
类型
A(1,1)%i,A(1,1)%j,A(2,1)%i,A(2,1)%j,...
但是不建议这样做,因为对元素或组件的访问速度可能会更慢,并且某些平台可能不允许与某些字节数不匹配的内存访问(导致访问速度非常慢)。
如果您想知道类型的存储大小,请使用storage_size()
内部函数(Fortran 2008)。结果是位。您也可以尝试使用非标准但通用的扩展功能loc()
,它提供变量的地址。两个相邻元素的loc的差别是元素大小。使用c_loc()
(Fortan 2003)和transfer()
可以完成相同的操作,其结果为integer(c_intptr_t)
。在MPI中,MPI_Sizeof()
函数也可以提供帮助。
是什么让你觉得它会以不同的方式存储? – 2014-12-04 20:36:49
某些用户定义的类型可能会有填充,以便使总大小为8个字节或更多的倍数。有编译器设置来影响这一点。 – ja72 2014-12-04 20:50:03