インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
標準の Fortran が複数のポインター・メモリー・アドレスを追跡しなければならない場合に備えて、インテル® Fortran コンパイラーは、配列の編成に関する詳細情報を格納する配列記述子を使用します。
(結合またはプロシージャー・インターフェイス・ブロックによる) 明示的なインターフェイスを使用する場合、コンパイラーは次の形式の配列引数記述子を生成します。
Fortran 配列ポインター
形状引き継ぎ配列
割付け配列
Co-Array
クラス・オブジェクト
特定の種類の引数は、適切な明示的インターフェイスが提供されている場合でも、記述子を使用しません。例えば、明示的形状配列および大きさ引き継ぎ配列は記述子を使用しません。一方、配列ポインターおよび割付け配列は、引数として使用するかどうかにかかわらず、記述子を使用します。
インテル® Fortran と C/C++ の間で呼び出しを行う場合、暗黙的インターフェイスを使用することで、インテル® Fortran の記述子なしで配列を渡すことができます。ただし、呼び出されたルーチンがインテル® Fortran 記述子に含まれる情報を必要とする場合、ルーチンを明示的インターフェイスで宣言し、仮配列を形状引き継ぎ配列またはポインター属性として指定します。
Fortran 配列は、(配列境界が "矩形" である限り) 任意の形式で編成された任意のメモリー部分と関連付けることができます。また、Fortran 配列ポインターを C 言語に渡し、C 言語で記述子を正しく解釈して、必要な情報を取得することができます。
ただし、配列記述子を使用すると、エラーが起こる可能性が高くなります。また、対応するコードの移植性も損なわれます。
記述子が正しく定義されていない場合、プログラムは間違ったメモリーアドレスを参照し、一般保護違反を発生させることがあります。
配列記述子の書式は、各 Fortran コンパイラーに対して固有です。配列記述子を使用するコードは、他のコンパイラーやプラットフォームへ移植できません。
配列記述子の書式は、将来変更される可能性があります。
コンパイラーによりビルドされた記述子は、ユーザーが変更することはできません。既存の記述子のフィールドを変更することは不正です。
次に、IA-32 アーキテクチャーのシステム上における現在のインテル® Fortran の配列記述子のコンポーネントを示します。
バイト 0 から 3 には、ベースアドレスが含まれています。
バイト 4 から 7 には、配列の 1 つの要素のサイズが含まれています。
バイト 8 から 11 は、予約済みです。明示的に指定してはなりません。
バイト 12 から 15 には、配列の情報を保存するのに使用されるフラグのセットが含まれます。含まれるセットは次のとおりです。
ビット 1 (0x01): 配列が定義されている -- 配列が定義されている (記憶領域が割り当てられている) 場合、設定します。
ビット 2 (0x02): 割り当て解除が許可されていない -- 指定した配列が割り当て解除できない場合 (明示的配列のターゲットの場合)、設定します。
ビット 3 (0x04): 配列が連続的である -- 指定した配列が、連続的な全体配列または配列スライスの場合、設定します。
ビット 8 (0x80): 配列が ALLOCATABLE を指している場合、設定します。
その他のビットは予約されています。
バイト 16 から 19 には、配列の次元 (次元数) が含まれています。
バイト 20 から 23 は、予約済みです。明示的に指定してはなりません。
残りのバイトには、個々の (最大 31 までの) 次元に関する情報が含まれています。各次元は 3 つの 4 バイトのエンティティーによって記述されます。
要素の数 (範囲)
この次元の連続する 2 つの要素の開始アドレス間の距離 (バイト数)
下限
次元数 1 の配列は、3 つの 4 バイトのエンティティーを追加する必要があるため、合計で 9 つの 4 バイトのエンティティー (6 + 3*1) が含まれ、バイト 35 で終わります。次元数 7 の配列は、合計で 27 の 4 バイトのエンティティー (6 + 3*7) が含まれ、バイト 107 で終わります。
宣言の例 |
---|
integer,target :: a(10,10) integer,pointer :: p(:,:) p => a(9:1:-2,1:9:3) call f(p) ... |
実引数 p の記述子には、次の値が含まれます。
バイト 0 から 3 には、ベースアドレスが含まれます (ランタイムで割り当てられます)。
バイト 4 から 7 は、4 (1 つの要素のサイズ) に設定されます。
バイト 8 から 11 は、予約済みです。
バイト 12 から 15 には、3 が含まれます (配列は定義済み、割り当て解除は不可)。
バイト 16 から 19 には、2 が含まれます (次元数)。
バイト 20 から 23 は、予約済みです。
バイト 24 から 35 には、最初の次元に関する次の情報が含まれています。
5 (範囲)
-8 (要素間の距離)
9 (下限)
バイト 36 から 47 には、2 番目の次元に関する次の情報が含まれています。
3 (範囲)
120 (要素間の距離)
1 (下限)
この例では、バイト 47 が最後のバイトとなります。
インテル® 64 アーキテクチャー・ベースのシステムの記述子は、IA-32 アーキテクチャー・ベースのシステムの記述子と同じ書式を使用しますが、すべてのフィールドが 4 バイトから 8 バイトになります。