スタックとヒープ

両方ともメモリの領域のことで、OSによって論理的に領域を分けられ、用途ごとに別々の領域が使われるのようになっている

ざっくり

ヒープ:

  • よく想像するメモリ
  • 動的に領域を確保できる
  • 番地とセットで扱う(参照渡しとかで渡すメモリ番地はヒープの番地)

スタック:

  • 関数や実行をLIFO形式で管理する領域
  • 関数実行後にどこに戻るかなどを管理できるようにしている
  • 無限ループで関数を実行するとスタックがいっぱいになってエラーになる(スタックオーバーフロー)

ヒープ

動的に領域を確保できるメモリ領域。 ただし、動的に領域を確保するので速度はスタックより遅い

動的に領域を確保し、その番地を変数に格納することで、ヒープの領域を利用できる

実行時に値が決まるものがヒープに格納されることが多い (例: 長さが変わる配列や、構造体など)

スタック

関数の実行を管理するためのメモリ領域。 LIFOで関数の実行を管理している。

関数を読み込んだタイミングで、実行順にスタックに実行コードが積み込まれる

中に関数が含まれていた場合、それが展開されてスタックに積み込まれる

また静的な値はヒープを使わず、スタックに格納されることが多い(厳密には言語による)

参考