質問: ヒープ領域とスタック領域の違いについて教えてください ひとまず以下の疑問があります。 * いつ確保されるのか * どちらが早いのか * サイズはいつ決定されているのか * スタックに確保されているAuto変数とはなにか * ヒープ領域はなぜ、双方向リストによって構成されているのか * スタック領域のデータ構造はどのようなものなのか --- 追記 * なぜ、データ構造に違いを与えたのか
回答: * ヒープ領域とスタック領域の違いについて教えてください メモリ領域にはテキスト領域、静的領域、ヒープ領域、スタック領域の4つの領域がある。 テキストはプログラム、静的はグローバル変数やstatic変数、スタックは装飾しのないローカル変数、ヒープは動的に確保できる ここでプログラムやグローバル変数は利用する数や処理が確定すれば、プログラム中でサイズが変化することはない、スタックはOSやコンパイラがサイズを指定しているため定まったサイズが与えられる、ヒープはプログラム中で確保や廃棄されるため可変となる。 * いつ確保されるのか スタックではプログラムの変数の宣言の直後に、確保し`}`に到達すると廃棄される、これは関数を多く呼び出す構造をもたせた時、変数はスタックと同じ動作になる。正確にはブロックや関数毎に管理される。 ヒープ領域では動的確保なので`malloc`や`new`によって確保され、`free`や`delete`によって廃棄される。 * どちらが早いのか スタックのほうが高速、ヒープは複雑でOSの処理が挟まれる分遅い。 また、最適化の影響を受けやすい静的領域やスタック領域ではより高速なキャッシュへデータが確保されやすい。 * サイズはいつ決定されているのか スタック領域はコンパイラやOSがサイズを決めています。そのため、実行時には確定しています。 ヒープ領域はmalloc内でシステムコールを呼び出し確保できた時にサイズが確定します。失敗した場合は確保されません。 * スタックに確保されているAuto変数とはなにか 自動(Auto)変数のこと。文中のブロックを抜けると自動的に開放される変数のこと。 * ヒープ領域はなぜ、双方向リストによって構成されているのか OSのメモリ管理に使われているデータ構造のため。ヒープ領域はmalloc内のシステムコールでOSにより確保されている、メモリ管理のデータ構造はリストの構造として与えられる利用時はアドレスが連続しているようにOSにより見せられるため意識する必要はない。OSのアドレスとのプログラムでのアドレスとの差を埋める方法としてはアドレッシング・モードがある。 * スタック領域のデータ構造はどのようなものなのか スタック。削除するとき最後に入ってき関数を削除する。関数毎にスタックフレームとして管理される。スタック領域を全て使用し切るとスタックオーバーフローとなる。 * なぜ、データ構造に違いを与えたのか 確保を担当しているプログラムの違いがデータ構造に違いを与えているため 特に主記憶ではスワップが必要になるためOSとしてはリストを利用したほうが計算オーダーが少なく済む。