0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

スタックあふれとその対策

Posted at
1 / 10

復習:スタックとは何か(1/2)

  • 関数を呼び出すと確保されるメモリ領域
  • 関数から関数を呼び出すと確保したメモリ領域(=枠/フレーム)が積み上がっていく(=スタック)

複数:スタックとは何か(2/2)

  • スタックの中には以下のようなものが含まれます
    • 呼び出し元スタックの位置情報
    • スタック内の変数の領域

ポイント

  • スタックが積み上がるとその分メモリを消費する!
  • これがかの有名はStack Overflow!(スタックあふれ)

スタックあふれが起きる状況

  • 関数の呼び出し階層がめちゃくちゃ深くなったら起きる
  • 起こる状況は限られている
    現実にスタックあふれが起きるのは、ほぼ再帰呼び出しが原因

再帰呼び出しとは

  • ある関数から自分自身を呼び出す
  • 例えばツリー構造の走査など、コレクション操作で起こりやすい

無限ループとの違いは?

  • 無限ループはスタックあふれすら起こらない状況
  • 同じスタックの中でループ止まらないループ処理を書いてしまったときに起きる
  • スタックあふれより深刻なバグ
    ただ、狙って実装することもある(イベントループやゲームループなど)
    もちろん、ループから脱出する手段が提供される

再帰呼び出しによるスタックあふれ対策

  • 原則・関数呼び出しを恐れる必要はない!
  • 「末尾再起」

末尾再起とは

  • 関数の最後に再帰呼び出しを行うこと
  • こうすると再帰呼び出しをループに変換する最適化が行われる!!

最後に

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?