【C・C++】4つのメモリ領域(記憶領域)
俺氏は専門学生時代はC++を勉強していたのだけど、
就職してからはC#,VB(.NET)ばかりでC++は全く関わらないという期間が長かった。(約4年ほど
4月の中旬から、久しぶりにC++の案件に携わることになったが、
案の定、俺氏の記憶からC++に関する情報は削除されている模様。。。
脳味噌の中のGCさんが「もう使ってないけんいいやろ」ってことで削除したのかな?
というわけでちょっと復習、今回はメモリ領域に関して。
2014/04/25 追記 ----------------------
Cと同じなのかと思ってたけど、C++は5つみたいです。
malloc関数とnew演算子で動的確保した場合は領域が違うとのこと。。。
Heap (ヒープ) ー ヒープはmallocを使い動的に宣言された変数を保存するメモリ領域です。
Free Store ー Free Storeはnewを使い動的に宣言された変数を保存するメモリ領域です。Newとdeleteはコンパイラによってはmallocとfreeを使い実装されていますが、HeapとFree Storeは別のメモリ領域なので、片方で作られたオブジェクトはもう片方から安全に破棄できるとは限られません。
Chapter6:6.1 new と delete の基本的な使い方
----------------------------------------------
4つのメモリ領域
まず4つのメモリ領域というのは以下。
「プログラム領域」
「静的領域」
「ヒープ領域」
「スタック領域」
ただし、各領域の呼称、メモリの使われ方は処理系によって異なる(らしい)
「プログラム領域」を「テキスト領域」と読んだり、
「静的領域」と「ヒープ領域」を合わせて「データ領域」と呼んだり。
各領域の使われ方
プログラム領域
機械語に翻訳されたプログラムが格納される場所です。
この機械語の命令が 1行づつ実行されてプログラムは動いています。
メモリから命令が実行されると、
PC(プログラムカウンタ)*1の値を増やすことで、
次の命令が格納されているアドレスを参照することができ、命令が実行されます。
分岐処理などがある場合は、
PCの内容を実行先の命令がある内容に書き換えることで実現しているみたいです。
静的領域
外部変数(グローバル変数)や静的変数(static変数)などの、
プログラム実行中に変化しない変数が格納される場所です。
この静的領域の大きさはプログラム実行時に確保され、
プログラム実行中にサイズが変化することがなく、固定サイズです。
ヒープ領域
動的にサイズが確保されるもの(malloc関数やnew演算子など)が格納される場所です。
静的領域とは違い、ヒープ領域のサイズはプログラム実行中も変化します。
一般的には1つのアプリで確保できるメモリのサイズは2GBまでで、
メモリは小さい方から大きい方に伸びます。
(先に確保したものから若いアドレスを持つ)
スタック領域
自動変数(局所変数)、関数の引数、戻り値、長い計算式等の一時変数などが格納される場所です。
CPUのレジスタを一時的に退避させた場合もこの領域に割り当てられます。
スタック領域のサイズは固定です。
大きなメモリをスタック領域に確保しようとするとクラッシュします。
変数を定義しすぎてスタックオーバーフローになることもしばしば・・・
ヒープ領域とは逆で、一般的にメモリは大きい方から小さいほうに伸びます。
(後に確保したものから若いアドレスを持つ)
とりあえずこんなものかな?
記憶クラスも関係してくるので、
そちらについては参考になるものを
*1:実行する命令が格納されているメモリ上のアドレスを保持しているもの