インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
自動配列および一時的な計算用に作成される配列を、スタックではなくヒープ上に割り当てます。
Linux* および macOS*: | -heap-arrays [size] -no-heap-arrays |
Windows*: | /heap-arrays[:size] /heap-arrays- |
size |
配列のサイズをキロバイト (KB) 単位で表した整数値。size よりも小さな配列はスタックに配置されます。 |
-no-heap-arrays または /heap-arrays- |
コンパイラーは、自動配列および一時配列をスタックに割り当てます。 |
このオプションは、自動配列および一時的な計算用に作成される配列を、スタックではなくヒープ上に割り当てます。
このオプションが指定されると、コンパイル時に size を超えるサイズの自動 (一時) 配列はスタックではなく、ヒープ上に割り当てられます。サイズをコンパイル時に判断できない場合、コンパイラーは自動配列をヒープ上に割り当てます。
size で指定された値は、コンパイル時定数を使用して一時配列または自動配列の合計サイズをコンパイル時に判断できる場合にのみ使用されます。size 以上になることがコンパイル時に分かっている配列は、スタックではなくヒープ上に割り当てられます。例えば、size を 10 とした場合、
10KB 以上の自動配列および一時配列はすべてヒープ上に割り当てられます。
10KB 未満の自動配列および一時配列はすべてスタック上に割り当てられます。
size が省略され、一時配列または自動配列のサイズをコンパイル時に判断できない場合、合計サイズが size 以上であると仮定され、配列はヒープ上に割り当てられます。
Windows* では、/F コンパイラー・オプションを使用して、スタック上に大きなオブジェクトを配置できるようにするため、ランタイムスタックのサイズを増やすようにリンカーに指示します。
Linux* および macOS* では、シェルコマンド unlimit を使用して、実行前にランタイムスタックのサイズを増やすことができます。
Visual Studio*: [Optimization (最適化)] > [Heap Arrays (ヒープ配列)]
Eclipse*: なし
Xcode*: [Data (データ)] > [Allocate Automatics to the Heap (自動変数をヒープに割り当て)]
なし
Fortran では、自動配列のサイズはランタイム式から取得されます。次に例を示します。
RECURSIVE SUBROUTINE F( N )
INTEGER :: N
REAL :: X ( N ) ! 自動配列
REAL :: Y ( 1000 ) ! スタックの明示形状ローカル配列
上記の例の配列 X は、heap-array オプションの影響を受けますが、配列 Y は影響を受けません。
一時配列はルーチン呼び出しを行う前や配列操作がオーバーラップを検出したときによく作成されます。次に例を示します。
integer a(10000)
a(2:) = a(1:ubound(a,dim=1)-1)
この場合、代入の左辺と右辺が明らかにオーバーラップしているため、配列代入は一時中間配列を使用します。
heap-arrays オプションを指定すると、コンパイラーはヒープ上に一時配列を作成します。
size 50 で heap-arrays オプションを指定すると、コンパイラーはスタック上に一時配列を作成します。これは、一時中間配列のサイズがコンパイル時に判断でき (40KB)、そのサイズが size 値未満であるためです。
次の例では、配列スライス宣言から連続した配列を作成して渡します。
call somesub(a(1:10000:2))
heap-arrays オプションを指定すると、コンパイラーはヒープ上に一時配列を作成します。
size 25 で heap-arrays オプションを指定すると、コンパイラーはスタック上に一時配列を作成します。これは、コンパイル時の一時中間配列のサイズが 20KB しかないためです。