プログラムの実行時、呼び出したサブルーチンに関する情報を蓄えるスタックのことです。
サブルーチン(関数やメソッドなど)を呼び出すたび、戻り先のメモリアドレス(リターンアドレス)、戻り値や引数、(静的変数でない)ローカル変数のためのメモリ領域といった情報を格納(ワインド)します。サブルーチンから抜け出すときには、この情報を取り除きます(アンワインド)。ここで、1つのサブルーチンに関する情報のまとまりを、スタックフレームと呼びます。
複数のスレッドが動作しているプログラムでは、コールスタックはスレッドごとに存在します。
スタックフレームにアクセスするために、コールスタックの最上段の位置をあらわすスタックポインタを使ったり、スタックフレーム内の特定の情報がある位置をあらわすフレームポインタを使ったりします。これらは専用レジスタの一種です。
コールスタックの必要性や利用方法はいくつかありますが、特にサブルーチン内のコードの実行を終えた後の戻り先を制御するために重要な仕組みになっています。高級言語では、コンパイラが自動的に必要なコードを生成しますが、低級言語では、プログラマーが自力で行わなければならない場合もあります。
デバッグ目的で利用されることも多く、任意のタイミングでコールスタックの内容をみることで、現在までのサブルーチンの呼び出し経路、そのときの引数やローカル変数の内容などを確認できます。このようなデバッグの手法をスタックトレースといいます。
Visual Studio でスタックトレースを行う方法を、「Visual Studio編>関数の呼び出し履歴」で取り上げています。
サブルーチンの呼び出しの連鎖が長く続くと、スタックフレームが膨大になり、コールスタックの領域を使い尽くすことがあります。このような状況を、スタックオーバーフローと呼びます。スタックオーバーフローが起こると、たまたまメモリ上にあった無関係のデータを上書きしてしまい、メモリ破壊を起こす可能性があります。実行時エラーになる場合もあります。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |