#pragma isolated_call

C に適用 C++ に適用

説明

#pragma isolated_call ディレクティブは、パラメーターが意味する副次作用の他には、副次作用を持つことも、また副次作用に依存することもない関数にマークを付けます。

構文


構文図

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);
}
 

関連参照

汎用プラグマ
ignprag
isolated_call IBM Copyright 2003