6

C言語を使用すると、ソースファイルを先読みせずに1回のパスで読み取ることができます。どの時点でも、コンパイラは、ファイル内の現在の位置の前に表示された宣言、プロトタイプ、マクロ定義などを考慮するだけで済みます。

これは、関数呼び出しをインライン化するために、コンパイラーが呼び出しの前に関数を定義する必要がある可能性があることを意味しますか?例えば:

int foo(void);
int bar(void) { return foo(); }
inline int foo(void) { return 42; }

fooインライン定義がの定義の前に移動された場合、への呼び出しはインライン化される可能性が高くなりbarますか?

コード内でインライン定義を配置して、インライン化するのが最適な呼び出しの前に表示されるようにする必要がありますか?または、インライン化を行うのに十分な高度な最適化コンパイラが、呼び出し後に定義が表示された場合でも(gccの場合のように)定義を見つけることができると仮定できますか?

編集:オプション付きのPelles C/Ob1では、呼び出しをインライン化する前に、定義を表示する必要があることに気付きました。コンパイラーは、この制限を取り除くオプションも提供し/Ob2ます(また、gccと同様に、コンパイラーがインライン指定子なしで関数をインライン化できるようにします)が、ドキュメントには、この2番目のオプションを使用するとはるかに多くのメモリーが必要になる可能性があると記載されています。

4

1 に答える 1

3

実際には何の違いもないはずです。なぜなら、明示的にinline. inlineコンパイラは、キーワードを使用して定義されている場合でも、関数をインライン化する場合があります。

まず、gcc 4.6.3最適化を行わずにコードを実行しました。

$ gcc -fdump-ipa-inline test.c 

生成されたアセンブリから、foobarはインライン化されていますが、インライン化されていませんfoo。の定義をinline foo一番上に置くように変更したとき、コンパイラはまだ両方をインライン化しませんでした。

次に私は同じことをしました-O3

$ gcc -fdump-ipa-inline -O3 test.c 

これで、両方の関数がインライン化されました。inline宣言を持っているのは1つだけですが。

基本的に、コンパイラは適切と思われる関数をインライン化できます。

于 2012-08-21T20:15:54.020 に答える