ソースファイルにこの小さな関数があるとします
static void foo() {}
バイナリの最適化されたバージョンをビルドしますが、この関数をインライン化したくありません (最適化の目的で)。インライン化を防ぐためにソース コードに追加できるマクロはありますか?
gcc
固有のnoinline
属性が必要です。
この関数属性は、関数がインライン化の対象になることを防ぎます。関数に副作用がない場合は、インライン化以外の最適化により関数呼び出しが最適化されますが、関数呼び出しはライブです。そのような呼び出しが最適化されないようにするには、
asm ("");
次のように使用します。
void __attribute__ ((noinline)) foo()
{
...
}
GCCには、と呼ばれるスイッチがあります
-fno-inline-small-functions
したがって、gcc を呼び出すときにそれを使用します。しかし、副作用として、他のすべての小さな関数もインライン化されていません。
これを行う移植可能な方法は、ポインターを介して関数を呼び出すことです。
void (*foo_ptr)() = foo;
foo_ptr();
これにより、分岐するためのさまざまな指示が生成されますが、それはあなたの目標ではないかもしれません. これは良い点をもたらします:ここでのあなたの目標は何ですか?
でコンパイラ エラーが発生した場合は__attribute__((noinline))
、次の方法を試してください。
noinline int func(int arg)
{
....
}
static __attribute__ ((noinline)) void foo()
{
}
これが私のために働いたものです。
noinline
次の属性を使用します。
int func(int arg) __attribute__((noinline))
{
}
おそらく、外部使用のために関数を宣言するときと、関数を記述するときの両方で使用する必要があります。