C++学習ノート——メモリモデル(変数格納位置)
5635 ワード
文書ディレクトリ階層概要 一、スタック: 二、スタック: 三、グローバルエリア(静的エリア) 四、定数記憶領域 例詳細 階層の概要
一、スタック:
通常は局所変数,関数パラメータなどの記憶領域である.staticとして宣言されたローカル変数を除く
二、スタック:
動的に割り当てられたメモリ.newやmallocのように、この領域でメモリ領域を申請します.この領域メモリの管理は、newまたはmallocによってメモリが申請された場合、プログラム終了時にdeleteまたはfreeによって対応するメモリを解放する必要があるプログラムライターによって担当される必要があります.newとdeleteの内容は後で詳しく説明します.
この領域はユーザーが申請できるため、申請の大きさは状況によって異なり、通常は一致しないため、この領域のメモリの断片化を招きやすい.
三、グローバルエリア(静的エリア)
コンパイラがコンパイルされるとメモリが割り当てられます. bss:この領域には、初期化されていないグローバル変数とstaticとして宣言されたローカル変数が格納されます.bssセグメント(手動で初期化されていないデータ)は、セグメントのデータに空間を割り当てるのではなく、データを記録するために必要な空間の大きさである. data:初期化されたグローバル変数とstaticとして宣言されたローカル変数を格納する 四、定数記憶領域 rodata定数文字列はここに置かれています.プログラムが終了するとシステムから解放されます.ここでrodata領域とtext領域は、ロード時に定数領域と呼ばれ、その領域の内容は読み取りのみ許可され、変更は許可されないセグメントにマージされます. text:コードセグメント(Code)とも呼ばれ、text領域はプログラムがリンクをコンパイルして生成したマシンコードを保存する.
例を挙げて詳しく述べる
参考記事http://vra.github.io/2015/01/25/cpp-memory-mode/
一、スタック:
通常は局所変数,関数パラメータなどの記憶領域である.staticとして宣言されたローカル変数を除く
二、スタック:
動的に割り当てられたメモリ.newやmallocのように、この領域でメモリ領域を申請します.この領域メモリの管理は、newまたはmallocによってメモリが申請された場合、プログラム終了時にdeleteまたはfreeによって対応するメモリを解放する必要があるプログラムライターによって担当される必要があります.newとdeleteの内容は後で詳しく説明します.
この領域はユーザーが申請できるため、申請の大きさは状況によって異なり、通常は一致しないため、この領域のメモリの断片化を招きやすい.
三、グローバルエリア(静的エリア)
コンパイラがコンパイルされるとメモリが割り当てられます.
例を挙げて詳しく述べる
#include
using namespace std;
const double pi=3.1415926; // :
static int out=0; // : ,data
int i=1; // : ,data
int j; // : ,bss
void func1()
{
static int count; // : ,bss
count++;
int i=count % 10; // :
cout<<"count % 10="<<i<<endl; //"count % 10=" :
}
void func2()
{
int i=0; // :
int *pi=&i; // :
*pi=*pi+1;
cout<<"i="<<i<<endl; //"i=" :
}
int main()
{
static int out=2; // : ,data
cout<<"out="<out<<endl;
func1();
func2();
return 0;
}
参考記事http://vra.github.io/2015/01/25/cpp-memory-mode/