2016-07-26 12 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

宣言の順序が重要なケースが1つあります。別の宣言が何らかの方法で依存している場合です。しかし、あなたは注文の「法的な」側面について気にしませんか? – francescalus

答えて

5

宣言が以前に宣言されたエンティティに依存しない限り、順序は関係ありません。

明らか

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

あなたが別のエンティティを参照するため、この順序を使用する必要があります。

お互いに依存していない場合は関係ありません。どのような方法であれ効率の点では重要ではありません。スタイルについては誰もが自分の意見を持つことができます。ここでそれについて話し合う理由はありません。あなたは、メモリ内の不便なアドレスから開始し、ベクトル化するのが困難であるとのアレイを強制することができますので、それは共通ブロックを重要ではでき

また、特定の型宣言には関係ない:

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

があるためsequenceせずに、異なる

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

と違っ

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

よりそれよりもメモリにレイアウトされますコンパイラはいくつかのパディングを自由に挿入することができ、通常はそうするでしょうt3にあります。

相互運用タイプ

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

はまた、構成要素の順序を強制するが、コンパイラは、パフォーマンスのためにパディングを含むことができます。これは、Cコンパイラのパディング規則を使用します。

+0

あなたは正しいですが、このトピックにあるかどうかは不明ですが、言及することができます。 –

+0

'sequence'タイプは非常に制限的です。型コンポーネントの 'pointer'属性を持つことはできません。また、 'equivalatable'ステートメントを使いたい場合は、' 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のバイト境界上にあることは間違いありません。 コンパイラスイッチオプションもあります。 fortでは '-align array64byte'です。 これは、あなたがやりたいと思っているはずのベクトル化するときにのみ効果があります。したがって、配列/ベクトルを何らかの形で整列させる必要があります。

関連する問題