スタック(スタックメモリ)って、そもそもナニ?

はじめに

プログラミングを学んでいると、よく出てくる言葉のひとつに「スタック(stack)」があります。
でも、「スタックって何?」「メモリってどう関係してるの?」と思ったことはありませんか?

今回はそんな「スタック」について、なるべくわかりやすく説明していきます。

スタックの意味は?

まず「スタック(stack)」という単語は、「積み重ねる」という意味があります。たとえば「本の山」や「お皿の山」をイメージしてみましょう。上にどんどん重ねていく感じです。そして、スタックのルールはとても簡単。

「最後に置いたものを、最初に取り出す」

つまり「後入れ先出し(LIFO: Last In, First Out)」という仕組みです。たとえば、お皿を重ねていくとき

  • 最初に置いたお皿は一番下。すぐには取れません。
  • 最後に置いたお皿(いちばん上)は、すぐ手に取れます。

これがスタックの基本的な動きです。

プログラムの中でのスタック

では、コンピュータの中で「スタック」はどう使われているのでしょうか?実は、プログラムが関数を呼び出すたびに、スタックが活躍しています。

たとえば、こんな流れを考えてみましょう

main() → funcA() → funcB()

プログラムが main() から funcA() を呼び出し、さらに funcA() が funcB() を呼ぶと、
コンピュータは 「今どの関数の途中なのか」 を覚えておく必要があります。

このとき使われるのが スタックメモリ です。

  • main()からfuncA()を呼ぶとき、funcAの情報をスタックに積む
  • funcA()からfuncB()を呼ぶとき、funcBの情報をスタックに積む

そして funcB()内の処理が終わると、スタックから funcBの情報が取り除かれます。
続いて funcAの処理が終わると、funcAの情報が取り除かれ……
最終的にmainに戻ります。

このように、「どの関数を今実行中か」「戻るべき場所はどこか」などを順番に管理しているのがスタックなんです。

スタックオーバーフローとは?

スタックには当然、限界(上限の容量)があります。もし関数呼び出しを延々と繰り返したり、巨大なデータを積みすぎたりすると、スタックの山があふれてしまいます。これを スタックオーバーフロー(stack overflow) と呼びます。

「呼び出しが深すぎる」とか「再帰が止まらない」というエラーが出るときは、たいていこのスタックの限界を超えてしまっているんです。

合わせて読みたい

なぜスタックを使うの?

では、なぜこんな仕組みをわざわざ使うのでしょう?それは、スタックがシンプルかつ高速だからです。

  • いつも「上に積む」「上から取る」だけなので、処理が速い
  • 関数の始まりと終わりが「LIFO」にピッタリ合う
  • メモリの管理がラク

この特徴のおかげで、私たちは複雑な関数の呼び出しを意識せずにプログラムを書けるのです。

まとめ:スタックをイメージで覚えよう

スタックメモリを一言で言えば、プログラムが「いま何をしているか」を積み重ねて記録するメモ帳のようなもの。

本の山を思い出してください。いちばん上に置いたものを、いちばん先に取り出す。
それがスタックの原則であり、コンピュータの中でも同じルールが使われているのです。