148

ソースファイルにこの小さな関数があるとします

static void foo() {}

バイナリの最適化されたバージョンをビルドしますが、この関数をインライン化したくありません (最適化の目的で)。インライン化を防ぐためにソース コードに追加できるマクロはありますか?

4

8 に答える 8

171

gcc固有のnoinline属性が必要です。

この関数属性は、関数がインライン化の対象になることを防ぎます。関数に副作用がない場合は、インライン化以外の最適化により関数呼び出しが最適化されますが、関数呼び出しはライブです。そのような呼び出しが最適化されないようにするには、 asm ("");

次のように使用します。

void __attribute__ ((noinline)) foo() 
{
  ...
}
于 2009-09-24T20:46:12.437 に答える
39

GCCには、と呼ばれるスイッチがあります

-fno-inline-small-functions

したがって、gcc を呼び出すときにそれを使用します。しかし、副作用として、他のすべての小さな関数もインライン化されていません。

于 2011-08-18T11:25:48.503 に答える
24

これを行う移植可能な方法は、ポインターを介して関数を呼び出すことです。

void (*foo_ptr)() = foo;
foo_ptr();

これにより、分岐するためのさまざまな指示が生成されますが、それはあなたの目標ではないかもしれません. これは良い点をもたらします:ここでのあなたの目標は何ですか?

于 2009-09-24T20:59:04.220 に答える
14

でコンパイラ エラーが発生した場合は__attribute__((noinline))、次の方法を試してください。

noinline int func(int arg)
{
    ....
}
于 2010-09-21T12:54:55.443 に答える
11
static __attribute__ ((noinline))  void foo()
{

}

これが私のために働いたものです。

于 2010-10-30T00:39:51.847 に答える
9

noinline 次の属性を使用します。

int func(int arg) __attribute__((noinline))
{
}

おそらく、外部使用のために関数を宣言するときと、関数を記述するときの両方で使用する必要があります。

于 2009-09-24T20:44:38.087 に答える