デフォルトでは、C、C++、および数値演算の各標準ライブラリ関数のいくつかはコンパイラによってインライン化されます。通常、この処理によってプログラムの実行速度が速くなります。
ライブラリ関数をインライン展開すると、予期しない結果になる場合があります。インライン化されたライブラリ関数では、errno 変数は設定されません。したがって、errno 変数を設定するかしないかによって動作が異なるコードに対しては、-nolib_inline オプションを使用しなければなりません。そうすれば、ライブラリ関数のインライン展開は禁止されます。また、コンパイラから提供されるライブラリ関数と同じ名前を持つ関数はライブラリ関数と見なすため、元々の呼び出し命令は、インライン化されたものと置き換わります。したがって、既知のライブラリ・ルーチンのいずれかと同じ名前を持つ関数がプログラムの中で定義している場合は、その関数そのものが必ず使用されるように -nolib_inline オプションを使用する必要があります。
注
ライブラリ関数の自動インライン展開は、プロシージャ間の最適化処理中にコンパイラが行うインライン展開とは関連がありません。例えば、次のコマンドを実行すると、sum.cpp というプログラムがコンパイルされます。このとき、ライブラリ関数の展開は行いませんが、プロシージャ間の最適化 (IPO) によるインライン展開は行います:
prompt>icpc -ip -nolib_inline sum.cpp
IPO の詳細は、「プロシージャ間の最適化」を参照してください。
インテル® C++ コンパイラは、-use_msasm オプションによってMASM* スタイルのインライン・アセンブリをサポートします。構文については、MASM のマニュアルを参照してください。
インテル C++ コンパイラは、GNU式 スタイルのインライン・アセンブリをサポートします。構文は、次のとおりです:
asm-keyword [ volatile-keyword ] ( asm-template [ asm-interface ] ) ;
構文要素 | 説明 |
---|---|
asm-keyword | asm 文は asm キーワードで始まります。または、互換性のため、__asm もしくは __asm__ が使用されることもあります。 |
volatile-keyword | オプションの volatile キーワードが指定されたら、asm は volatile です。2 つの volatile asm 文は、お互いに移動しません。volatile 変数への参照は、volatile asm へ相対移動しません。 または、互換性のため、__volatile もしくは __volatile__ が使用されることもあります。 |
asm-template | asm-template は、アセンブリ・コードを出力する方法を指定する C 言語の ASCII 文字列です。テンプレートの多くは固定文字列です。代入ディレクティブ以外のすべては、アセンブリにそのまま渡されます。代入ディテクティブの構文は、% の後に 1 または 2 文字続きます。サポートされた代入ディテクティブは、次のセクションで指定されます。 |
asm-interface | asm-interface は次の 3 つの部分で構成されます: 1. output-list (オプション) 2. input-list (オプション) 3. clobber-list (オプション) これらは、コロン (:) で区切ります。 output-list がなく、input-list が指定される場合、output-list の代わりに、input-list は 2 つのコロン (::) に続きます。 asm-interface がすべて省略された場合、volatile-keyword の指定の有無にかかわらず、asm 文は volatile とみなされます。 |
output-list | output-list は、カンマで区切られた 1 つ以上の output-specs から構成されます。 asm-template に代入するために、各 output-spec には番号が付けられます。 output-list の最初のオペランドは 0 で、次は 1 のようになります。 番号付けは、output-list から input-list へ続行します。 オペランドの合計数は 0-9 個です。 |
input-list | output-list と類似して、input-list はカンマで区切られた 1 つ以上の input-specs から構成されます。 asm-template に代入するために、各 input-spec には番号が付けられます。番号は、output-list のオペランドから続きます。 |
clobber-list | clobber-list は asm が特定のマシンレジスタを使用または変更することをコンパイラに伝えます。特定のマシンレジスタは直接 asm にコードされるか、アセンブリの命令によって暗黙的に変更されます。 clobber-list は、カンマで区切られた clobber-specs のリストです。 |
input-spec | input-specs は、挿入されたアセンブリの命令によって必要とされる値の式をコンパイラに伝えます。 asm の必須入力をすべて示すのに、実際には asm-template に参照されない input-spec を一覧表示できます。 |
clobber-spec | 各 clobber-spec は、壊れた 1 つのマシンレジスタ名を指定します。レジスタ名は、オプションで先頭に % を使用できます。 有効なレジスタ名: eax, ebx, ecx, edx, esi, edi, ebp, esp, ax, bx, cx, dx, si, di, bp, sp, al, bl, cl, dl, ah, bh, ch, dh, st, st(1) - st(7), mm0 - mm7, xmm0 - xmm7, および cc また、clobber-spec で"メモリ" を指定することもできます。 これを指定すると、コンパイラはレジスタにキャッシュされたデータを asm 文に渡さないようにします。 |