Fortran的最佳申报单?

Bou*_*ech 0 fortran variable-declaration

我实际上有一个嵌套的问题:

  1. 变量声明的顺序在Fortran中是否重要?
  2. 如果是,声明变量的最佳顺序是什么?

例如,这个程序是:

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 ...
Run Code Online (Sandbox Code Playgroud)

比这更好:

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 ...
Run Code Online (Sandbox Code Playgroud)

(通过"更好",我的意思是有效的内存管理和更快)

谢谢你的回答!

Vla*_*r F 5

不,订单无关紧要,除非您的声明取决于先前声明的实体.

明显

  integer, parameter :: arr(*) = [1,2,3]
  integer :: arr2(size(arr))
Run Code Online (Sandbox Code Playgroud)

必须使用此订单,因为您引用另一个实体.

如果他们不依赖彼此就没关系.无论以何种方式效率都无关紧要.对于风格,每个人都可以有自己的看法,什么是最好的订单,没有理由在这里讨论.

可能在一个公共块中很重要,因为那时你可以强制一个数组从内存中一个不方便的地址开始,并且更难以矢量化.

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

  type t1
    sequence
    integer(int32) :: field1
    integer(int16) :: field2
  end type
Run Code Online (Sandbox Code Playgroud)

将以不同于记忆的方式布局

  type t2
    sequence
    integer(int16) :: field2
    integer(int32) :: field1
  end type
Run Code Online (Sandbox Code Playgroud)

而那个不同于

  type t3
    integer(int16) :: field2
    integer(int32) :: field1
  end type
Run Code Online (Sandbox Code Playgroud)

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

可互操作的类型

   type, bind(C) :: t3
     ...
Run Code Online (Sandbox Code Playgroud)

还强制执行组件的顺序,但编译器可以包含性能的填充.它将使用C编译器的填充规则.