intrinsic
プラグマの引数リストで指定された関数の呼び出しが組み込みであることを指定します。
#pragma intrinsic( function1 [, function2, ...] )
解説
intrinsic プラグマは、関数の動作が既知であることをコンパイラに指示します。 コンパイラは、関数を呼び出し、より優れたパフォーマンスを得られる場合は、関数呼び出しをインライン命令に置き換えないことがあります。
組み込み形式のライブラリ関数を以下に示します。 コンパイラが intrinsic プラグマを検出した後、組み込み関数を含む最初の関数定義に達した時点でそのプラグマが有効になります。 その後、プラグマの効果は、ソース ファイルの最後まで、または同じ組み込み関数を指定した function プラグマが検出されるまで持続します。 intrinsic プラグマは、関数定義の外側でのみ (グローバル レベルで) 使用できます。
次の関数は、組み込み形式を持ち、その組み込み形式は /Oi を指定すると使用されます。
|
|||
|
|||
|
組み込み関数を使うと、関数呼び出しのオーバーヘッドがなくなるためプログラムの実行速度は向上しますが、コードが追加されるためプログラムのサイズが大きくなる可能性があります。
x86 固有の仕様→
_disable および _enable 組み込み関数は、割り込みを無効または有効にするカーネル モード命令を生成するため、カーネル モード ドライバーで役立ちます。
使用例
コマンド ラインで「cl -c -FAs sample.c」と入力して次のコードをコンパイルし、sample.asm を見て組み込み関数が x86 命令の CLI と STI になることを確認します。
// pragma_directive_intrinsic.cpp
// processor: x86
#include <dos.h> // definitions for _disable, _enable
#pragma intrinsic(_disable)
#pragma intrinsic(_enable)
void f1(void) {
_disable();
// do some work here that should not be interrupted
_enable();
}
int main() {
}
End x86 固有の仕様
次に示す浮動小数点関数には本物の組み込み形式はありません。 代わりに、引数をプログラム スタックにプッシュするのではなく、浮動小数点演算コプロセッサに直接渡すバージョンがあります。
|
次に示す小数点関数は、/Oi、/Og、および /fp:fast (または /Og を含むオプション、つまり、/Ox、/O1、/O2) を指定すると、本物の組み込み形式を持ちます。
|
|
|
/fp:strict または /Za を使用して、本物の組み込み浮動小数点オプションの生成をオーバーライドできます。 浮動小数点関数はライブラリ ルーチンとして生成されます。これらのライブラリ ルーチンでは、引数はプログラム スタックにプッシュされずに、数値演算コプロセッサに直接渡されます。
ソース テキストのブロックで組み込み関数を有効または無効にする方法の詳細と例については、「#pragma function」を参照してください。