2014-12-04 41 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()函數也可以提供幫助。