復習:スタックとは何か(1/2)
- 関数を呼び出すと確保されるメモリ領域
- 関数から関数を呼び出すと確保したメモリ領域(=枠/フレーム)が積み上がっていく(=スタック)
複数:スタックとは何か(2/2)
- スタックの中には以下のようなものが含まれます
- 呼び出し元スタックの位置情報
- スタック内の変数の領域
ポイント
- スタックが積み上がるとその分メモリを消費する!
- これがかの有名はStack Overflow!(スタックあふれ)
スタックあふれが起きる状況
- 関数の呼び出し階層がめちゃくちゃ深くなったら起きる
- 起こる状況は限られている
現実にスタックあふれが起きるのは、ほぼ再帰呼び出しが原因
再帰呼び出しとは
- ある関数から自分自身を呼び出す
- 例えばツリー構造の走査など、コレクション操作で起こりやすい
無限ループとの違いは?
- 無限ループはスタックあふれすら起こらない状況
- 同じスタックの中でループ止まらないループ処理を書いてしまったときに起きる
- スタックあふれより深刻なバグ
ただ、狙って実装することもある(イベントループやゲームループなど)
もちろん、ループから脱出する手段が提供される
再帰呼び出しによるスタックあふれ対策
- 原則・関数呼び出しを恐れる必要はない!
- 「末尾再起」
末尾再起とは
- 関数の最後に再帰呼び出しを行うこと
- こうすると再帰呼び出しをループに変換する最適化が行われる!!
最後に
- Stack Overflowはこちらです
https://ja.stackoverflow.com/