スタックとヒープ
両方ともメモリの領域のことで、OSによって論理的に領域を分けられ、用途ごとに別々の領域が使われるのようになっている
ざっくり
ヒープ:
- よく想像するメモリ
- 動的に領域を確保できる
- 番地とセットで扱う(参照渡しとかで渡すメモリ番地はヒープの番地)
スタック:
- 関数や実行をLIFO形式で管理する領域
- 関数実行後にどこに戻るかなどを管理できるようにしている
- 無限ループで関数を実行するとスタックがいっぱいになってエラーになる(スタックオーバーフロー)
ヒープ
動的に領域を確保できるメモリ領域。 ただし、動的に領域を確保するので速度はスタックより遅い
動的に領域を確保し、その番地を変数に格納することで、ヒープの領域を利用できる
実行時に値が決まるものがヒープに格納されることが多い (例: 長さが変わる配列や、構造体など)
スタック
関数の実行を管理するためのメモリ領域。 LIFOで関数の実行を管理している。
関数を読み込んだタイミングで、実行順にスタックに実行コードが積み込まれる
中に関数が含まれていた場合、それが展開されてスタックに積み込まれる
また静的な値はヒープを使わず、スタックに格納されることが多い(厳密には言語による)