16

C++ でインライン関数呼び出しをテストしています。

Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)

C++ プログラミング言語の Stroustrup は次のように記述します。

インライン指定子は、関数のコードを一度配置してから通常の関数呼び出しメカニズムを介して呼び出すのではなく、インラインでコード [...] を生成しようとするコンパイラへのヒントです。

しかし、生成されたコードが単にインラインではないことがわかりました。isquare関数のCALL命令があります。

代替テキスト

なぜこうなった?インライン関数を使用するにはどうすればよいですか?

編集:使用されるコマンドラインオプション:

**** Build of configuration Debug for project InlineCpp ****

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\InlineCpp.o ..\src\InlineCpp.cpp
g++ -oInlineCpp.exe src\InlineCpp.o
4

7 に答える 7

48

Michael Kohne が述べたように、inline キーワードは常にヒントであり、関数の場合、GCC はそれをインライン化しないことにしました。

Gcc を使用しているため、__attribute((always_inline)) で強制的にインライン化できます。

例:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

出典: GCC インライン ドキュメント

于 2009-06-01T12:06:39.417 に答える
23

インライン関数を作成するようコンパイラに強制する一般的な C++ の方法はありません。引用したテキストの「ヒント」という言葉に注意してください-コンパイラーはあなたの言うことを聞く義務はありません。

何かを絶対にインラインにする必要がある場合は、コンパイラ固有のキーワードが必要になるか、関数の代わりにマクロを使用する必要があります。

編集: njsf は、応答で適切な gcc キーワードを提供します。

于 2009-06-01T12:00:05.653 に答える
8

デバッグ ビルド (最適化が無効) を見ていますか? コンパイラは通常、デバッグを困難にするため、「デバッグ」ビルドでインライン展開を無効にします。

いずれにせよ、inline指定されたのは確かにヒントです。コンパイラは、関数をインライン化する必要はありません。コンパイラがインライン ヒントを無視することを決定する理由はいくつかあります。

  • コンパイラは単純で、インライン化をサポートしていない可能性があります
  • コンパイラは、内部アルゴリズムを使用してインライン化するものを決定し、ヒントを無視する場合があります。
    (特に IA64 のような複雑なアーキテクチャでは、何をインライン化するかを選択する際に、コンパイラが実行できるよりも優れた処理を実行できる場合があります)
  • コンパイラは独自のヒューリスティックを使用して、ヒントにもかかわらず、インライン化によってパフォーマンスが向上しないと判断する場合があります。
于 2009-06-01T12:11:35.367 に答える
4

インライン化は、この関数をインライン化できる場合、コンパイラーはインライン化を検討する必要があるというコンパイラーへの提案にすぎません。非常に単純であるため自動的にインライン化される関数もあれば、インライン化を提案する他の関数は、複雑すぎるためにインライン化されないものもあります。

また、デバッグ ビルドを行っていることに気付きました。実際にはわかりませんが、コンパイラーがデバッグビルドのインライン化を無効にする可能性があります.

于 2009-06-01T12:44:24.707 に答える
3

これはヒントであり、コンパイラはヒントを無視することを選択できます。GCCが一般的に無視する場所を読んだと思います。フラグがあったと聞いたのを覚えていますが、それでも 100% のケースでは機能しません。(まだリンクが見つかりません)。

フラグ: -finline-functions は -O3 最適化レベルでオンになります。

于 2009-06-01T12:04:15.490 に答える
0

同様の問題に直面し、インライン関数がヘッダー ファイルに記述されている場合にのみ機能することがわかりました。

于 2009-06-01T12:50:39.467 に答える
0

インライン化するかどうかはコンパイラ次第です。インラインヒントを無視するのは自由ですか。一部のコンパイラには特定のキーワード ( __forceinlineVC++ など) がありますが、そのようなキーワードを使用しても、仮想メンバー関数への仮想呼び出しはインライン化されません。

于 2009-06-01T12:03:00.280 に答える