#pragma isolated_call

説明

#pragma isolated_call ディレクティブは、パラメーターによって暗黙指定されるものを除き、副次作用を持たない、または副次作用に依存しない関数にマークを付けます。

構文

構文図を読む構文図をスキップする>>-#--pragma--isolated_call--(--function--)--------------------><
 

function は、1 次式であり、ID、演算子関数、変換関数、限定名のいずれかです。ID は、型関数または typedef 関数でなければなりません。 名前により多重定義関数を参照する場合、この関数のすべての可変部は、孤立した呼び出しとしてマークされています。

-qisolated_call コンパイラー・オプションには、このプラグマと同じ効果があります。

このプラグマは、リストされた関数がそのパラメーターによって暗黙指定された以外の副次作用を持っておらず、また依存もしていないことをコンパイラーに通知します。 以下のような場合、関数は副次作用を持つか、それに依存していると考えられます。

基本的には、ランタイム環境の状態での変更は副次作用と見なされます。 ポインターまたは参照によって渡された関数引数を変更することは、唯一許可される副次作用です。他の副次作用を持つ関数は #pragma isolated_call ディレクティブにリストされたときに誤った結果を与えることがあります。

関数を isolated_call としてマーク付けすると、呼び出された関数によって外部変数および静的変数を変更できないことと、必要に応じてストレージへの不正な参照を呼び出し関数から削除できることが最適化プログラムに通知されます。 命令はより自由にリオーダーでき、その結果、パイプラインの遅延が少なくなり、プロセッサーの実行が速くなります。 同じパラメーターを指定している同じ関数に対する複数の呼び出しを結合することが可能で、 結果が不要であれば、呼び出しを削除することができて、 呼び出し順序を変更することができます。

指定された関数は、不揮発性外部オブジェクトを検査することが許可され、ランタイム環境の不揮発性状態に依存する結果を戻します。 また、関数はその関数に渡されるポインター引数 (つまり参照による呼び出し) によって指示されるストレージを変更することもできます。 自身を呼び出す関数、またはローカル静的ストレージに依存する関数は指定しないでください。このような関数を #pragma isolated_call ディレクティブにリストすると、予期しない結果になります。

-qignprag コンパイラー・オプションを指定すると、別名割り当てプラグマが無視されます。 この -qignprag コンパイラー・オプションを使用して、 #pragma isolated_call ディレクティブを含むアプリケーションをデバッグしてください。

次の例は、#pragma isolated_call ディレクティブの使用法を示します。 this_function 関数には副次作用がないため、この関数を呼び出しても外部関数 a の値は変更されません。コンパイラーは、other_function への引数が値 6 を持ち、メモリーから変数が再ロードされないことを想定することができます。

int a;

// Assumed to have no side effects
int this_function(int);
	
#pragma isolated_call(this_function)
that_function()
{
   a = 6;
   // Call does not change the value of "a"
   this_function(7);

   // Argument "a" has the value 6
   other_function(a);
}

関連情報