Bou*_*ech 0 fortran variable-declaration
我实际上有一个嵌套的问题:
例如,这个程序是:
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)
?
(通过"更好",我的意思是有效的内存管理和更快)
谢谢你的回答!
不,订单无关紧要,除非您的声明取决于先前声明的实体.
明显
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编译器的填充规则.