インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
文内のすべての呼び出しのインライン展開を指定します。
これらは特定の文に対するインライン展開プラグマです。C/C++ 文の前に置いて、その文内のすべての呼び出しと、その文内にある入れ子された文内のすべての呼び出しに適用することができます。
forceinline プラグマは、コンパイラーがその呼び出しをインライン展開できる場合には、常にインライン展開するように指示します。
inline プラグマは、コンパイラーのヒューリスティックによって、過剰なインライン展開、ソースコードのコンパイル処理速度の大幅な低下、実行ファイルサイズの大幅な増加、またはパフォーマンスの低下を招くことが判断された場合を除き、その呼び出しをインライン展開するようにコンパイラーに指示します。
noinline プラグマは、その呼び出しをインライン展開しないように指示します。
特定の文に対するプラグマは、特定の関数に対するプラグマよりも優先されます。
次の例では、#pragma forceinline recursive プラグマが使用されています。#pragma forceinline recursive が 'sun(a,b)' 呼び出しと 'sun(a,b)' の中の 'fun(a,b)' の呼び出しに適用されます。
#include <stdio.h>
static void fun(float a[100][100], float b[100][100])
{
inti , j;
for (i = 0; i < 100; i++) {
for (j = 0; j < 100; j++) {
a[i][j] = 2 * i;
b[i][j] = 4 * j;
}
}
}
static void sun(float a[100][100], float b[100][100])
{
int i, j;
for (i = 0; i < 100; i++) {
for (j = 0; j < 100; j++) {
a[i][j] = 2 * i;
b[i][j] = 4 * j;
}
fun(a, b);
}
}
static float a[100][100];
static float b[100][100];
extern int main()
{
int i, j;
for (i = 0; i < 100; i++) {
for (j = 0; j < 100; j++) {
a[i][j] = i + j;
b[i][j] = i - j;
}
}
for (i = 0; i < 99; i++) {
fun(a, b);
#pragma forceinline recursive
for (j = 0; j < 99; j++) {
sun(a, b);
}
}
fprintf(stderr, "%d %d\n", a[99][9], b[99][99]);
}