17


7

Cインライン関数はGCCを使っています - なぜCALLなのでしょうか。

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

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

Cプログラミング言語のStroustrupは、

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

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

http://i42.tinypic.com/8ys3f4.jpg [altテキストhttp://i42.tinypic.com/8ys3f4.jpg]

なんでこんなことが起こっているの? それでは、インライン関数をどうやって使うことができますか?

  • EDIT:*使用されるコマンドラインオプション:

**** 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

7 Answer


47


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

Gccを使っているので__attribute((always_inline))を使ってインラインに強制することができます。

例:

/ *プロトタイプ。 * / inline void foo(const char)__attribute __((always_inline));

出典:http://gcc.gnu.org/onlinedocs/gcc/Inline.html [GCCインラインドキュメント]


22


インライン関数を作成するためにコンパイラを強制する一般的なCの方法はありません。 あなたが引用したテキストの中の単語 'ヒント’に注意してください - コンパイラはあなたに耳を傾ける義務を負いません。

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

編集:彼の応答でnjsfは適切なgccキーワードを与えます。


8


デバッグビルドを見ていますか(最適化は無効)。 コンパイラはデバッグを難しくするため、通常 "debug"ビルドのインライン展開を無効にします。

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

  • コンパイラは単純で、インライン展開をサポートしていない可能性があります。

  • コンパイラーは内部アルゴリズムを使用して、インライン化するものを決定する場合があります ヒントを無視します。 _(場合によっては、特にIA64のような複雑なアーキテクチャーでは、インライン化するものを選択する場合に比べて、コンパイラーの方がうまくいくことがあります)

  • コンパイラは、独自のヒューリスティックを使用して、 ヒント、インライン化はパフォーマンスを改善しません


4


インラインとは、この関数をインライン展開することが可能であれば、コンパイラがそうすることを検討する必要があるという、コンパイラに対する提案に他なりません。 単純なので自動的にインライン化される関数もあれば、インライン展開してくれる他の関数が複雑になるからではありません。

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


3


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

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


0


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


0


私は同様の問題に直面し、インライン関数がヘッダファイルに書かれている場合にのみ機能することを発見しました。