2014-12-04 72 views
1

在Fortran中的二维阵列存储在列主要格式,例如:Fortran派生数据类型的二维阵列存储

integer, allocatable, dimension(:,:)::A 
allocate(A(3,4)) 

阵列“A”将被存储在存储器中作为A(1,1) ,A(2,1),A(3,1),A(1,2),A(2,2),A(3,2)...等等。

但会发生什么,当我有一个派生数据类型,例如:

type :: innerdata 
integer :: i 
real :: j  
end type innerdata 
type(innerdata), allocatable, dimension(:,:) :: A 
allocate(A(3,4)) 

如何数组“A”现在存储在内存?谢谢!

+2

是什么让你觉得它会以不同的方式存储? – 2014-12-04 20:36:49

+0

某些用户定义的类型可能会有填充,以便使总大小为8个字节或更多的倍数。有编译器设置来影响这一点。 – ja72 2014-12-04 20:50:03

回答

5

派生类型数组存储在相同的列 - 主要顺序。

您可能想知道单个组件在哪里存储。它们与数组元素地址的偏移量未指定,顺序可能与声明顺序不同,并且它们之间可能存在各种间隔。但是,一旦建立了偏移量的值(通过调用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()函数也可以提供帮助。