intrinsic pragma

pragma の引数リストで指定された関数の呼び出しが組み込みであることを指定します。

構文

#pragma intrinsic(function_1 [,function_2 ... ] )

解説

intrinsicpragma は、関数の動作が既知であることをコンパイラに指示します。 コンパイラは、関数を呼び出し、より優れたパフォーマンスを得られる場合は、関数呼び出しをインライン命令に置き換えないことがあります。

組み込み形式のライブラリ関数を以下に示します。 コンパイラが intrinsicpragma を検出した後、組み込み関数を含む最初の関数定義に達した時点でそのプラグマが有効になります。 その効果は、ソース ファイルの最後まで、または同じ組み込み関数を指定した functionpragma が検出されるまで持続します。 intrinsicpragma は、関数定義の外側でのみ (グローバル レベルで) 使用できます。

次の関数は、組み込み形式を持ち、その組み込み形式は /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() {
}

浮動小数点組み込み型の関数

これらの浮動小数点関数には、真の組み込み形式はありません。 代わりに、引数をスタックでプッシュするのでなく、浮動小数点演算コプロセッサに直接渡すバージョンがあります。

これらの浮動小数点関数は、/Oi および /fp:fast (または /Oi: /Ox/O1、および /O2 を含むあらゆるオプション) を指定すると、真の組み込み形式を持ちます。

/fp:strict または /Za を使用して、真の組み込み浮動小数点オプションの生成をオーバーライドできます。 浮動小数点関数はライブラリ ルーチンとして生成されます。これらのライブラリ ルーチンでは、引数はプログラム スタックにプッシュされずに、数値演算コプロセッサに直接渡されます。

ソース テキストのブロックで組み込み関数を有効および無効にする方法の詳細と例については、「#pragma function」を参照してください。

関連項目

pragma ディレクティブと __pragma および _Pragma キーワード
コンパイラの組み込み