コンパイラの組み込み

ほとんどの関数はライブラリに含まれますが、関数によっては、コンパイラに組み込まれているものもあります。 これらは、組み込み関数または組み込みと呼ばれます。

解説

関数が組み込みの場合、その関数のコードは通常、インラインで挿入されます。これにより、関数呼び出しのオーバーヘッドを回避し、その関数の非常に効率的なマシン語命令が生成されるようにします。 組み込みは通常、同等のインライン アセンブリよりも高速です。これは、オプティマイザーに組み込み関数の動作数に関する組み込まれた知識があるため、インライン アセンブリが使用できない最適化を使用できるためです。 また、オプティマイザーは、組み込みの展開、バッファーの配置、その他の調節を、呼び出しのコンテキストと引数に応じて行うことができます。

組み込みの使用はコードの移植性に影響します。これは、Visual C++ で使用できる組み込み関数が、コードが他のコンパイラでコンパイルされた場合には利用できない場合があったり、また、あるターゲット アーキテクチャで使用できる組み込みが、すべてのアーキテクチャで使用できるとは限らないためです。 ただし、組み込みは通常、インライン アセンブリよりも移植性があります。 組み込みはインライン アセンブリがサポートされていない 64 ビット アーキテクチャに必要です。

__assume__ReadWriteBarrier などの組み込みは、オプティマイザーの動作に影響を与える情報をコンパイラを提供します。

組み込み関数としてのみ使用できる組み込みもあり、また関数および組み込み実装の両方で使用できる組み込みもあります。 特定の関数のみを有効化するか、またはすべての組み込みを有効化するかによって、2 つのうちの 1 つの方法で組み込みの実装を使用するようにコンパイラに指示を与えることができます。 1 つ目は、#pragma intrinsic(<組み込み関数名リスト>) を使用する方法です。 プラグマを使用して、コンマで区切った 1 つの組み込みまたは複数の組み込みを指定することができます。 2 つ目は、特定のプラットフォームのすべての組み込みを利用可能にする /Oi (組み込み関数の生成) のコンパイラ オプションを使用することです。 /Oi で、#pragma function(<組み込み関数名リスト>) を使用して、組み込み関数の代わりに関数呼び出しを強制的に使用します。 特定の組み込みのドキュメントに、ルーチンが組み込みとしてのみ使用可能であると記載されている場合は、/Oi または #pragma intrinsic が指定されているかどうかに関係なく、組み込み実装が使用されます。 いずれの場合も、/Oi または #pragma intrinsic により、オプティマイザーは組み込みを使用することができますが、その使用を強制されることはありません。 オプティマイザーは、関数を呼び出すことも可能です。

いくつかの標準 C/C++ ライブラリ関数は、いくつかのアーキテクチャの組み込み実装で使用できます。 CRT 関数を呼び出すと、コマンド ラインで /Oi が指定された場合に、組み込み実装が使用されます。

共通組み込み関数のプロトタイプを宣言するヘッダー ファイルである <intrin.h> を使用できます。 製造元固有の組み込みは、<immintrin.h> および <ammintrin.h> ヘッダー ファイルにあります。 さらに、特定の Windows ヘッダーは、コンパイラの組み込みにマップする関数を宣言します。

次のセクションでは、さまざまなアーキテクチャで使用できるすべての組み込みを示します。 特定のターゲット プロセッサでの組み込みの動作の詳細については、開発元のリファレンス ドキュメントを参照してください。

関連項目

ARM アセンブラー リファレンス
Microsoft Macro Assembler リファレンス
キーワード
C ランタイム ライブラリ リファレンス