スタックの違い-メモリパーティション

2098 ワード

C++メモリはいったいいくつの領域に分かれていますか?
1:
1、スタック領域(stack)-コンパイラによって自動的に割り当てられて解放され、関数のパラメータ値、ローカル変数の値などが格納されます.その動作は、データ構造内のスタックに似ています.
2、ヒープエリア(heap)-一般的にプログラマーによってリリースが割り当てられ、プログラマーがリリースされない場合、プログラムの終了時にosによって回収される可能性がある.データ構造のスタックとは異なることに注意してください.割り当て方はチェーンテーブルに似ています.ほほほ.
3、グローバル領域(静的領域)-、グローバル変数と静的変数の記憶はブロックにあり、初期化されたグローバル変数と静的変数はブロック領域にあり、初期化されていないグローバル変数と初期化されていない静的変数は隣接する別のブロック領域にある.-プログラムが終了するとシステムが解放されます.
4、文字定数領域-定数文字列はここにあります.プログラムが終了するとシステムから解放されます.
5、プログラムコード領域-関数体のバイナリコードを保存する.
 
 
スタックとスタックの違い
一、予備知識—プログラムのメモリ割り当て
c/C++でコンパイルされたプログラムが消費するメモリは、以下の部分に分けられます.
1、スタック領域(stack)-コンパイラによって自動的に割り当てられて解放され、関数のパラメータ値、ローカル変数の値などが格納されます.その動作は、データ構造内のスタックに似ています.
2、ヒープエリア(heap)—一般的にプログラマーによってリリースが割り当てられ、プログラマーがリリースしない場合、プログラム終了時にOSによって回収される可能性がある.データ構造のスタックとは異なることに注意してください.割り当て方はチェーンテーブルに似ています.ほほほ.
3、グローバル領域(静的領域)-、グローバル変数と静的変数の記憶はブロックにあり、初期化されたグローバル変数と静的変数はブロック領域にあり、初期化されていないグローバル変数と初期化されていない静的変数は隣接する別のブロック領域にある.-プログラム終了後にシステム解放
4、文字定数領域-定数文字列はここにあります.プログラム終了後にシステムから解放
5、プログラムコード領域-関数体のバイナリコードを保存する.
 
C言語を勉強したばかりの頃、グローバル変数と静的変数はプログラムの実行のライフサイクル全体にわたってアクセスできることが分かったが、ローカル変数は変数を宣言する関数でしかアクセスできず、ローカル変数を宣言する関数が出ると、ローカル変数は破棄される.局所変数はプロセスのスタックに割り当てられ,グローバル変数と静的変数はあるセグメント(segment)に割り当てられるためであることも知られている.しかし、ずっとぼんやりしていて、よく分からないような気がします.
最近Windowsのメモリ管理やPEファイルのフォーマットを見ていると、急にこの問題が明らかになったような気がします.Windowsでは、exeファイルはプロセスのアドレス空間に直接マッピングされ、グローバル変数と静的変数は生成されたexeファイルのあるセグメント、すなわち、exeファイルがプロセスのアドレス空間にマッピングされると、グローバル変数と静的変数がプロセスのアドレス空間にマッピングされるため、プログラム実行の全周期で、グローバル変数と静的変数はアクセスできます.ローカル変数はプロセスのスタックに割り当てられ、関数の実行が完了するとスタックが復元されるため、ローカル変数は関数でのみ使用できます.
 
 
二、例プログラム
これは先輩が書いたもので、とても詳しいです.
//main.cpp
int a = 0;        
char *p1;         
main()
{
    int b; //  
    char s[] = "abc"; //  
    char *p2; //  
    char *p3 = "123456"; //123456\0    ,p3   。 
    static int c =0; //  (  )     
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    //     10 20         。 
    strcpy(p1, "123456"); //123456\0     ,         p3    "123456"       。 
}