KDOC 411: スタックは積み重ねて取り出して解放する。ではヒープは?
この文書のステータス
- 作成
- 2025-06-30 貴島
- レビュー
- <署名>
概要
スタックとヒープについて聞かれた。
スタック領域は関数呼び出しとともに積み重ねてローカル変数を保存していき、抜けるとともに解放できる明確なイメージがあった。しかし、ヒープはどう使われているかを答えられなくて凹んだ。
逆になぜ、スタックの使用方法は明確なイメージがあったのだろうか。それはよくコードとアセンブリを比較していたからだ。スタックベースの操作が頻繁に登場し、関数呼び出し時にメモリを確保し、抜けるときに破棄する流れをよく見た。
多くのCPUの命令セットアーキテクチャは push
/ pop
/ ret
などのスタック操作をサポートしている。これらの命令は「一番上に積む」「一番上から取る」という制限された動きしかできず柔軟性はない。だからコンパイル時にサイズを決めて機械的に変換でき、どの領域が使われているかは明確である。スタックは、CPUレベルで使っていると言える。
いっぽう、アセンブリでヒープ確保は、 malloc
のようなライブラリ関数の呼び出し(call
)として現れる。そのさきで何が行われているかは、OSや言語処理系レベルの話だ。スタックより柔軟に使えるが複雑なために、上のレイヤーに任せているといえる。
関連
- ヒープ領域 - Wikipedia
- KDOC 141: Cのポインタ操作をアセンブリで見る。アセンブラを見ていた例