C で関数を強制的にインライン化する従来の方法は、関数をまったく使用せず、マクロのような関数を使用することでした。このメソッドは常に関数をインライン化しますが、関数のようなマクロにはいくつかの問題があります。例えば:
#define ADD(x, y) ((x) + (y))
printf("%d\n", ADD(2, 2));
C99 標準で C に追加されたinlineキーワードもあります。特に、Microsoft の Visual C コンパイラは C99 をサポートしていないため、その (惨めな) コンパイラでインラインを使用することはできません。インラインは、関数をインライン化する必要があることをコンパイラに示唆するだけであり、それを保証するものではありません。
GCC には、関数をインライン化するためにコンパイラを必要とする拡張機能があります。
inline __attribute__((always_inline)) int add(int x, int y) {
return x + y;
}
これをよりきれいにするために、マクロを使用することをお勧めします。
#define ALWAYS_INLINE inline __attribute__((always_inline))
ALWAYS_INLINE int add(int x, int y) {
return x + y;
}
特定の呼び出しで強制的にインライン化できる関数を持つ直接的な方法を知りません。ただし、次のような手法を組み合わせることができます。
#define ALWAYS_INLINE inline __attribute__((always_inline))
#define ADD(x, y) ((x) + (y))
ALWAYS_INLINE int always_inline_add(int x, int y) {
return ADD(x, y);
}
int normal_add(int x, int y) {
return ADD(x, y);
}
または、次のようにすることもできます。
#define ADD(x, y) ((x) + (y))
int add(int x, int y) {
return ADD(x, y);
}
int main() {
printf("%d\n", ADD(2,2)); // always inline
printf("%d\n", add(2,2)); // normal function call
return 0;
}
また、関数のインライン化を強制しても、コードが高速化されない場合があることに注意してください。インライン関数を使用すると、より大きなコードが生成されるため、キャッシュ ミスがさらに発生する可能性があります。それが役立つことを願っています。