C/C++の四大メモリパーティションと定数の記憶場所

3742 ワード

原文:https://blog.csdn.net/k346k346/article/details/45592329
C/C++プログラムのメモリパーティションを正しく理解することは、合格プログラム猿の基本的な要求である.ネットワーク上のストリームの2つの大きなバージョンのメモリパーティションは、それぞれ:
1.最大5つのメモリパーティション:ヒープ、スタック、グローバル/静的ストレージ、フリーストレージ、定数ストレージ.2.5つのメモリパーティション:スタック、スタック、グローバル/静的ストレージ、文字列定数、およびコード領域.
以上の2つのパーティションのどちらが正しいか、どちらが優れているか、どちらが悪いかにかかわらず、具体的なメモリパーティションはコンパイラと大きく関係していると思います.コンパイラによってメモリの区分は異なると思いますが、大きく異なります.総合的に比較し、関連資料を調べ、C/C++プログラムのメモリパーティションに対する自分の認識を提出する.スタック、スタック、静的ストレージ、コード領域の4つのメモリパーティションに分割できます.
スタック:プログラム猿が手動で申請し、手動で釈放し、手動で釈放しなければ、プログラムが終了した後、システムが回収し、ライフサイクルはプログラムの実行期間全体である.mallocまたはnewを使用してスタックの申請を行い、スタックの総サイズは機械の仮想メモリのサイズである.説明:newオペレータは本質的にmallocを使用してメモリの申請を行い、newとmallocの違いは以下の通りである:(1)mallocはC言語の関数であり、newはC++のオペレータである.(2)mallocが申請した後に返すタイプはvoid*であり,newが返すポインタにはタイプがある.(3)mallocはクラスのコンストラクション関数を呼び出すことなくメモリの割り当てのみを担当し,newはメモリを割り当てるだけでなくクラスのコンストラクション関数を自動的に呼び出す.
スタック領域:システムによるメモリの管理.主に関数のパラメータとローカル変数を格納します.関数の実行が完了すると、システムはスタックメモリを自動的に解放し、ユーザー管理を必要としません.プログラム全体のスタック領域のサイズはコンパイラでユーザーが自分で設定することができ、VSでデフォルトのスタック領域のサイズは1 Mで、VSで手動でスタックのサイズを変更することができます.64 bitsのLinuxのデフォルトスタックサイズは10 MBで、ulimit-sで一時的に変更できます.
静的ストレージ:静的ストレージ内の変数は、プログラムコンパイルフェーズでメモリ領域が割り当てられ、初期化されます.この内に存在するプログラムの実行期間全体が存在し、主に静的変数、グローバル変数、定数が格納されます.注意:(1)ここで初期化と未初期化のデータ領域を区別しないのは、静的記憶領域内の変数が初期化を表示しないとコンパイラが自動的にデフォルトで初期化するためである.すなわち、静的記憶領域内に未初期化の変数は存在しない.(2)静的記憶領域内の定数は定数と文字列定数に分けられ,初期化されると修正できない.静的ストレージ内の定数はグローバル変数であり、ローカル定数とは異なり、ローカル定数はスタックに格納され、実際にはポインタまたは参照によって間接的に変更できますが、グローバル定数は静的定数領域に格納されている場合は間接的に変更できません.(3)文字列定数は静的記憶領域の定数領域に格納され、文字列定数の名前はそれ自体であり、常変数に属する.(4)データ領域の具体的な区分は,変数タイプの理解に有利である.異なるタイプの変数が格納される領域が異なります.この4つのデータ領域の具体的な対応する変数については、後でインスタンスコードで説明します.
コード領域:プログラムボディのバイナリコードを格納します.例えば、私たちが書いた関数は、コード領域にあります.
サンプルコード:
int a = 0;//       
char *p1; //         NULL void main() { int b; //  char s[] = "abc";//  char *p2 = "123456";//123456       ,p2    static int c =0; //c      ,0     ,     const int d=0; //  static const int d;//      p1 = (char *)malloc(10);//     10     。 strcpy(p1, "123456"); //123456        ,         p2    "123456"        }

以上のすべてのコードは,バイナリにコンパイルされてコード領域に格納され,文字定数はコード領域に格納され,アドレスできない.
まとめ
C/C++メモリパーティションを理解するとき、データ領域、スタック、スタック、静的記憶領域、静的領域、定数領域、常変数領域、グローバル領域、文字列定数領域、静的定数領域、静的変数領域、文字定数領域、コード領域など、初心者が雲の中に霧の中に置かれているという用語によく遭遇します.ここでは,以上のパーティションの関係を明らかにしてみる.データ領域には、スタック、スタック、静的ストレージ領域が含まれます.静的記憶領域には、定数領域(静的定数領域)、グローバル領域(グローバル変数領域)、および静的変数領域(静的領域)が含まれます.定数領域には、文字列定数領域と定数領域が含まれます.コード領域:プログラムコンパイル後のバイナリコードを格納し、アドレス不可領域.
C/C++メモリパーティションは、コード領域とデータ領域の2つしかないと言えます.
転載先:https://www.cnblogs.com/heluan/p/8652809.html