2012-01-05 9 views
2

私はこのことがどのように機能するのか知る必要がありますか?これは私が "インライン関数へのすべての呼び出しを再コンパイルする必要がある"ことを意味します。私は、インライン関数がプログラムで使用されるたびにコンパイラが短い関数定義を再コンパイルし、このコンパイルされた短い定義のコピーをコードに配置するという本を読んでいます。インライン関数へのすべての呼び出しを再コンパイルする必要がありますか?

これはまったくわかりません。全体のプロセスを示す例の説明が高く評価されます。また、どのように効率を改善するのか説明してください。

ありがとうございます。

答えて

3

は、あなたがこのコードがあるとします。

void foo() { bar(); } 

int main() 
{ 
    foo(); 
    foo(); 
    foo(); 
} 

fooがインライン化されている場合、コンパイラは、本質的にように、コードを書き換えます:代わりにbar();のあなたは、より複雑な作品を持っている場合今

int main() 
{ 
    bar(); 
    bar(); 
    bar(); 
} 

そのコードは一回ではなく3回出現(コンパイル)されます。

増加した繰り返しコードに対して関数呼び出しのコストをトレードします。

コンパイラは実際に関数をインライン化することを拒否することがあります。 fooのアドレスを外に出して外出先に渡すと、スタンドアロン版を作成することはできません。実際には、最適なものに応じて、スタンドアローンとインライン展開をうまく組み合わせることができます。 (コードが生成されるより重要なのは、inlineキーワードが1定義ルールに与える影響です。)

+0

ありがとうKerek。とった。素晴らしい。 –

3

インライン関数は、コードを取り込み、それが使用されているすべての場所(つまりインライン)にコピーを挿入します。これにより、関数呼び出しのコストが節約されます。

Obviosulyあなたはそのコピーはどこにでも変更する必要があり、それが使用されている機能変更した場合 - と、それらのファイル(またはコードブロック)のそれぞれを

この

http://en.wikipedia.org/wiki/Inline_functionウィキペディア

から

+0

素晴らしいと簡単に説明されています。 Martinに感謝します。 –

2

を再コンパイルする必要がありますコンパイラがインライン関数呼び出しを関数定義に展開することを意味します。言い換えれば、関数の完全な本体は、呼び出しが行われるすべての場所で置き換えられます。 通常の関数の場合、関数定義は1か所に保持され、コンパイラは関数がコードで呼び出されるたびに関数を呼び出すコードを生成します。

関数をインラインとして指定するのはリクエストだけであり、コンパイラはこのリクエストも無視することに注意してください。

+0

ありがとうRajendran。とった。 –

関連する問題