概要
コールスタックとは関数の実行順序と実行状態を管理するためのスタック構造(LIFO)です。
一回の操作でスタックに積み上げるひとまとまりのデータをスタックフレームと言います。
- 関数が呼ばれると「スタックフレーム」が積まれる(push)
- 関数が終了するとフレームが取り除かれる(pop)
- 最後に呼ばれた関数が最初に終了する(LIFO: Last In, First Out)
=> スタックが割り当てられている量よりも多くのスペースを使用した場合、"stack overflow" エラーが発生します。
目的
コールスタックを使う目的は、サブルーチン(関数)の処理を完了して制御を戻す(呼び出し側に戻る)ときに、どこに戻ればよいか(戻るべき命令のアドレス)を記憶しておくことです。
関数自身が再帰的に呼び出された場合でも、戻るべき場所(リターンアドレス)は呼び出されるたびに記憶しておく必要があります。コールスタックはこの情報を管理するための構造です。
動き
下のインタラクティブ図で、関数の呼び出しと終了にともなってスタックフレームがどのように積まれ・取り除かれるかを確認できます。
main() が呼ばれると main フレームが push される
- main から
calculate() が呼ばれると calculate フレームが push される
- calculate から
add(3, 4) が呼ばれると add フレームが push される
add が 7 を返して終了すると add フレームが pop される
calculate が 17 を返して終了すると calculate フレームが pop される
main が 17 を表示して終了すると main フレームが pop され、スタックは空になる
参考