• ベストアンサー

関数呼び出しの処理

関数呼び出しはCPUの処理時間を消費しますが、実際 どのような処理がされるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

おそらく知りたいのは、関数呼び出しでは、(関数にせずに)直接記述した場合にくらべて、どれだけ処理が増えるかということですよね? そうであれば、実際にはかなり多くの処理が追加されることになります。 まず、呼び出し側の関数で使用していた自動変数やレジスタ変数のうち、関数呼び出しで破壊されるレジスタを使用していたものは全て退避されます。 次に引数をスタックやレジスタに格納します。 それから、戻り先番地を退避した上で、関数の先頭に分岐します。 呼び出された関数では、(多くの場合)その時点でのスタックポインタの値をフレームポインタに設定し、その関数内で必要な自動変数のサイズ分だけスタックポインタを進めます。 関数から戻るときは、スタックポインタとフレームポインタを元に戻し、戻り先番地に分岐します。 (必要に応じて)引数用のスタックを巻き戻し、退避していた呼び出し側の自動変数およびレジスタ変数を元に戻します。 C++の場合は、上記に加えて、呼び出した関数が例外を投げた場合の準備を行ってから、関数を呼び出す場合があります。

wabisabi_2004jp
質問者

お礼

その通りです。直接記述した場合にくらべて、どれだけ処理が増えるか、ということでした。言葉足らずですみません。 詳しくありがとうございます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

およそどの CPU でも同じ処理としてはサブルーチンのコール/サブルーチンからの復帰ですかね. 関数を呼出すときには, プログラムカウンタを保存して呼出したい関数の先頭アドレスをプログラムカウンタに設定する. 関数から戻ってくるときには保存しておいた (次の命令の) アドレスをプログラムカウンタに戻す. あとは, 引数があるときには引数の値をそれなりの場所 (スタックとか引数用のレジスタ) に置き, 関数から戻ってきたら (特にスタックに置いた場合には) 引数を捨てるなどの処理が必要になります. もっとも, 引数をどこに置くかは CPU やコンパイラ (や呼出される関数) によります.

wabisabi_2004jp
質問者

お礼

ありがとうございます。 難しいですね・・・

関連するQ&A