プログラミングの初期学習では、普段あまり意識することのないメモリ管理(スタック領域やヒープ領域)
知識としてなんとなくは知っているが、どのようにデータが管理されているのか?どのような違いがあるのか?などを意識してプログラミングできるほうが良いと思い、調べてみました。
メモリとは
メモリとは、PCが作業する時に使うデスク。
図書館のようにデスクがたくさんあるイメージ。
メモリ領域の確保について
プログラムがメモリを使う場合、必要な分だけ領域を確保する必要があります。
メモリの一部を一時的に自分専用に場所取りしておくことを、メモリ領域の確保といいます。
一方で、自分専用に一時的に確保したメモリ領域を誰でも使えるように戻しておくことを、メモリ領域の解放と言います。
下記を読めば図で分かりやすくイメージできます。花見の場所取りに例えてあり、イメージしやすいです。
メモリ領域の範囲
一般的にメモリ領域はプログラムごとに、OSによって確保されます。
プログラム管理用領域【OS管理】
静的変数領域【OS管理】
ヒープ・スタック領域【プログラムで使用可】
ヒープもスタックも英語では積み重ね・堆積という同義です。
下記で図で分かりやすく説明してくれてます。
スタックとヒープの違い
スタック領域
スタック領域に積まれる変数は、OSにより自動的に確保・解放をしてくれます。
通常の変数を定義する時はこのスタック領域が確保されてます。
ただしスタック領域だと、使用したい想定領域を予め確保する必要があるため、メモリを柔軟に活用したい時には不便なことがあります。
そのような場合に、ヒープ領域が活用できます。
ヒープ領域
ヒープ領域は上の説明でもあったように、臨時的な役割のメモリ領域です。
アプリケーションごとに、必要な場合に使用されます。
確保するサイズは可変的で、ファイルの読み込みなど実行してみないとサイズが分からないような時にヒープが使用されます。
ヒープの使用は必要最低限に抑えるべき
基本的にメモリ確保のうえでは、予め使用する容量や順序が決まっているスタック領域を優先的に使用したほうがよいです。
ヒープ領域に頼りすぎると、メモリリーク(メモリの枯渇)が生じ、ソフトウェア内でクラッシュする危険性などがあります。
スタック領域のように予め確保される容量が決まっていない分柔軟に対応できますが、注意が必要です。
まとめ
基本はOSで自動的に確保・解放してくれるスタック領域の使用を優先すべき。
必要な場合に、プログラム内でメモリ領域の確保・解放の管理が必要なヒープ領域を活用する。
ただし、メモリリークが起きないように注意が必要。