2016-07-26 79 views
0

其实我也嵌套问题:Fortran中最好的声明顺序?

  1. 是否Fortran语言的变量声明事项的顺序?
  2. 如果是,那么声明变量的最佳顺序是什么?

例如,是这样的程序:

PROGRAM order2 
IMPLICIT NONE 
LOGICAL :: boolean1,boolean2 
INTEGER :: int1,int2 
INTEGER,DIMENSION(:),ALLOCATABLE:: array_int_1D 
DOUBLE PRECISION,DIMENSION(:),ALLOCATABLE:: array_double_1D 
DOUBLE PRECISION,DIMENSION(:,:),ALLOCATABLE:: array_double_2D 
... instructions ... 

:比这

PROGRAM order1 
IMPLICIT NONE 
DOUBLE PRECISION,DIMENSION(:,:),ALLOCATABLE:: array_double_2D 
DOUBLE PRECISION,DIMENSION(:),ALLOCATABLE:: array_double_1D 
INTEGER,DIMENSION(:),ALLOCATABLE:: array_int_1D 
INTEGER :: int1,int2 
LOGICAL :: boolean1,boolean2 
... instructions ... 

更好?

(由“好”,我的意思是在内存管理效率和更快)

谢谢您的回答!

+2

有一个明显的例子,声明的顺序很重要:当另一个声明以某种方式依赖它时。但是你不关心订单的“合法”方面? – francescalus

回答

5

不,订单无关紧要,除非您的声明依赖于先前声明的实体。

很明显,因为你提到的另一个实体

integer, parameter :: arr(*) = [1,2,3] 
    integer :: arr2(size(arr)) 

必须使用此命令。

如果他们不依赖彼此,那并不重要。以任何方式提高效率并不重要。对于风格,每个人都可以有自己的意见,最好的命令是什么,没有理由在这里讨论。

可以不管在公共块,因为这样你可以强制数组开始在不方便的地址在内存中,更难以量化。

它也很重要在某些类型声明:

type t1 
    sequence 
    integer(int32) :: field1 
    integer(int16) :: field2 
    end type 

将内存比

type t2 
    sequence 
    integer(int16) :: field2 
    integer(int32) :: field1 
    end type 

进行布局不同,一个不同于

type t3 
    integer(int16) :: field2 
    integer(int32) :: field1 
    end type 

因为没有sequence编译器可以自由地插入一些填充,它通常会这样做在t3

可互操作的类型

type, bind(C) :: t3 
    ... 

也执行的组件的顺序,但是编译器可以包括用于性能的填充。它将使用C编译器的填充规则。

+0

你是对的,不确定它是否在这个主题中,但可以提及。 –

+0

请注意,'sequence'类型是非常有限的。你不能拥有type-components的'pointer'属性。另外,如果你想使用'equivalence'语句,'allocatable'类型组件是被禁止的。 – jlokimlin

+0

我很清楚,但这不是这个问题的答案。 –

0

我会做这个....

PROGRAM order1 
IMPLICIT NONE 
!DIR$ ATTRIBUTES ALIGN:  array_double_2D::64 
DOUBLE PRECISION,DIMENSION(:,:),ALLOCATABLE:: array_double_2D 
!DIR$ ATTRIBUTES ALIGN:  array_double_1D::64 
DOUBLE PRECISION,DIMENSION(:) ,ALLOCATABLE:: array_double_1D 
!DIR$ ATTRIBUTES ALIGN:  array_int_1D::64 
INTEGER,DIMENSION(:)   ,ALLOCATABLE:: array_int_1D 
INTEGER :: int1,int2 
LOGICAL :: boolean1,boolean2 
... instructions ... 

那么毫无疑问的是,阵列上的64个字节边界。 还有编译器开关选项。在堡垒中它是'对齐阵列64字节'。 这只会在你做矢量化时有所作为,你应该这样做......因此,你应该以某种方式对齐数组/矢量。