3秒でわかる
実行中のプログラムとデータを一時的に置く高速な記憶領域。電源を切ると消えるため、残したいデータはディスクへ書き出します。
30秒図解
もう少し詳しく
どういうものか
メモリ(主記憶、RAM)は、実行中のプログラムの命令とデータを置いておく記憶領域です。CPU が直接読み書きできる速度を持つ代わりに容量が小さく、電源を切ると内容が消えます。1 バイトごとにアドレスという通し番号が振られており、変数はこのアドレス上の場所に対する名前だと考えると理解が進みます。
なぜ必要か
CPU はディスク上のデータを直接処理できません。SSD であってもメモリとは 100 倍以上の速度差があり、毎回読みに行けば計算より待ち時間の方が長くなります。そこで実行に必要な分だけをメモリへ載せて処理し、結果をディスクへ戻します。この階層構造があるおかげで、安価で大容量のディスクと高速なメモリを両立できています。
具体例
int a = 10; // <a href="/glossary/stack" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">スタック</a>上に確保され、<a href="/glossary/function" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">関数</a>を抜けると消える
int *p = malloc(sizeof(int) * 100); // <a href="/glossary/heap" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">ヒープ</a>上に確保される
if (p == NULL) return 1;
p[0] = 42;
free(p); // 返却しないとリークになるimport sys
xs = [0] * 1000
print(sys.getsizeof(xs)) # この<a href="/glossary/list-ds" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">リスト</a>が占める概算バイト数C では確保と解放を自分で書きますが、Python や Java では参照されなくなった領域をガベージコレクタが自動で回収します。
つまずきやすいところ
似た用語との違い
プログラムから見たメモリは、用途ごとにいくつかの領域に分かれています。関数の呼び出しごとに積まれて自動で解放されるのがスタック、実行中に任意の大きさを確保して明示的または自動的に回収されるのがヒープ、プログラムの命令そのものや定数が置かれるのが静的領域です。再帰が深すぎて落ちるのはスタックが尽きたときで、確保し続けて落ちるのはヒープが尽きたときと、原因の切り分けにこの区別が効きます。
| 階層 | 速度 | 揮発性 |
|---|---|---|
| レジスタ / キャッシュ | 最速 | 消える |
| メモリ(RAM) | 速い | 消える |
| SSD / HDD | 遅い | 残る |
覚え方
机の上がメモリ、引き出しがディスクです。作業中の書類は机に広げ、終わったら引き出しへしまいます。机が狭いと出し入れが増えて仕事が遅くなります。