C++学習ノート——メモリモデル(変数格納位置)

5635 ワード

文書ディレクトリ
  • 階層概要
  • 一、スタック:
  • 二、スタック:
  • 三、グローバルエリア(静的エリア)
  • 四、定数記憶領域
  • 例詳細
  • 階層の概要
    一、スタック:
    通常は局所変数,関数パラメータなどの記憶領域である.staticとして宣言されたローカル変数を除く
    二、スタック:
    動的に割り当てられたメモリ.newやmallocのように、この領域でメモリ領域を申請します.この領域メモリの管理は、newまたはmallocによってメモリが申請された場合、プログラム終了時にdeleteまたはfreeによって対応するメモリを解放する必要があるプログラムライターによって担当される必要があります.newとdeleteの内容は後で詳しく説明します.
    この領域はユーザーが申請できるため、申請の大きさは状況によって異なり、通常は一致しないため、この領域のメモリの断片化を招きやすい.
    三、グローバルエリア(静的エリア)
    コンパイラがコンパイルされるとメモリが割り当てられます.
  • bss:この領域には、初期化されていないグローバル変数とstaticとして宣言されたローカル変数が格納されます.bssセグメント(手動で初期化されていないデータ)は、セグメントのデータに空間を割り当てるのではなく、データを記録するために必要な空間の大きさである.
  • data:初期化されたグローバル変数とstaticとして宣言されたローカル変数を格納する
  • 四、定数記憶領域
  • rodata定数文字列はここに置かれています.プログラムが終了するとシステムから解放されます.ここでrodata領域とtext領域は、ロード時に定数領域と呼ばれ、その領域の内容は読み取りのみ許可され、変更は許可されないセグメントにマージされます.
  • text:コードセグメント(Code)とも呼ばれ、text領域はプログラムがリンクをコンパイルして生成したマシンコードを保存する.

  • 例を挙げて詳しく述べる
    #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/