1

私は C と C++ にかなり慣れていないので、関数について理解しようとしています。インライン関数と呼ばれるこの用語に出くわし、関数がインラインで宣言されると、コンパイラはいつでもどこでも呼び出されたときにその関数にコード全体を貼り付けると理解しました。

これは実際には関数呼び出しで起こることだと思っていましたが、そうではないことに気付きました。

通常の関数が呼び出され、インライン関数が呼び出されたときにコンパイラとシステムレベルで何が起こるかについて、誰かが詳細に説明できますか?

これを理解するための資料は高く評価されます。

4

4 に答える 4

2

(非インライン) 関数を呼び出す場合、コンパイラは、関数のパラメーター/引数を、呼び出された関数がそれらを見つけることが期待される場所に配置する必要があります。場合によっては、引数をプロセス/スレッドのスタックに「プッシュ」します。また、CPU レジスタが特定の引数に割り当てられる場合もあります。次に、「戻りアドレス」、または呼び出された関数に続くアドレスがスタックにプッシュされ、呼び出された関数が制御を呼び出し元に戻す方法を知ることができます。


インライン関数を呼び出すとき、コンパイラは単に関数をコードに織り込みます。パラメータが配置される場所に関して、呼び出し元と呼び出された関数の間で共通のプロトコルは必要ありません。「return」ステートメント (呼び出されたインライン関数内) は、通常、インライン コードに続く次の命令にジャンプするために (コンパイラによって) 実装されます。


インライン関数をコード内で何度も呼び出すと、コード サイズが大きくなります。ただし、一般に、関数呼び出しを行うよりもインライン呼び出しを行う方が (CPU サイクルで) コストがかかりません。

于 2014-04-21T04:58:33.123 に答える
1

プログラムが関数を呼び出すと、プログラム制御は呼び出された関数に移されます。呼び出された関数は、定義されたタスクを実行し、return ステートメントが実行されるか、関数の終わりの閉じ中かっこに到達すると、プログラム制御をメイン プログラムに戻します。

于 2014-04-21T04:56:51.137 に答える
0

これを試して ください https://softwareengineering.stackexchange.com/questions/195385/understanding-stack-frame-of-function-call-in-cc -- 通常の関数の動作動作について

インライン関数の場合 、インライン関数コードは呼び出し場所でどのように置き換えられますか?

于 2014-04-21T05:18:49.820 に答える