ローカル変数、グローバル変数、スタック、スタック、静的およびグローバル違い

重要

111

図から分かるように、プログラムメモリはセクション以下の占有分かれています。

図1に示すように、スタック領域(スタック)

自動的機能など、ローカル変数のコンパイラのリリース、ストレージ・パラメータの値によって割り当てられた、メモリの割り当ては、我々はスタックと呼ぶものと通常同様に、連続的であり、それは、のように、その後の配列にそれを置く場合は不明ですメモリの割り当ては、連続的に割り当てられている、すなわち、メモリは、連続したメモリ領域に割り当てられています。我々は変数を宣言すると、コンパイラは自動的に、メモリの現在のスタック領域の終わりが割り当てるされます。

2、ヒープ領域(ヒープ)

プログラマによる一般的な配布リリースプログラマが解放しない場合、オペレーティングシステムは、プログラムの終了により回収することができます。リストに似て、分布は、ポインタによってリンク異なるメモリブロックの領域であるメモリ内の連続していません。我々は人工的なノードがメモリから解放されて切断するように、ノードたら、チェーンから切断されています。

図3に示すように、グローバル領域(静的領域)(静的)

グローバル変数と静的変数が相互に隣接する領域におけるグローバル変数と静的変数領域で、初期化されていないグローバル変数と初期化されていない静的変数の初期化の部分に格納されています。システムによって放出されたプログラムの終了後

4、リテラル領域

定数文字列がここに置かれています。システムによって放出されたプログラムの終了後

図5に示すように、プログラムコード領域

バイナリコード格納機能体。

例を見てください。

char型のC; //スタックに割り当て

するchar * p =新しいCHAR [3]; //ヒープ上に割り当てられ、Pに割り当てられたアドレス。

 

 

 

コンパイラはスペースアプリケーションよりもスタック領域内の時間は、その後、メモリ空間を割り当てた場合、そのサイズを計算し、現在のスタック内のスペース割り当てのために必要なスペースの量よりも多いを見つけるために、最初の命令に遭遇したとき注意:ここでは、内部空間の分布は連続しており、最後の代入の最後の分布が続いています。スタック領域のサイズはスペースアプリケーションよりも小さい場合、システムは、スタックオーバーフロー、及び対応する異常情報を明らかにする。-----カーネルクラッシュ

 

pは、スタック上に割り当てられ、そのpは、内部空間と、上記と同じ方法で割り当てられますが、新しいキーワードが検出されたとき、コンパイラはこれがユーザーであることを知っているされているので、コンパイラは、2番目の命令に遭遇するとダイナミックメモリ空間のアプリケーションなので、スペースの割り当ての検索を盛り上げに行きます。注意:ヒープメモリ空間は、その接続ゾーン時にブロックの内部空間を一覧表示することが適切である、連続していないので、メモリ空間の特定された割振りを受信した後、直ちに適切に割り当てません最初の列全体(全体鎖上すなわちカラム・ノード)上にスタックに、次に空間が、必要なスペースを計算し、必要があり、最初に割り当てられたメモリブロックは、それが発生しました。そして最後に、P。割り当てられた文字のヒープ割り当ての配列の最初のアドレスは、この時間は、我々は明確に、pはこれで、アプリケーションのヒープ内の文字の最初のアドレスアレイに格納されている、アプリケーションがヒープでありますアレイのアドレスは、現在スタックのアプリケーションでポインタ変数pに割り当てられています。問題より多くの画像を説明するために、以下を参照してください:

111

図から分かるように、まず、動的ポインタP点に格納されたコンテンツのヒープアレイに割り当てられたアドレス。

ご注意:私たち変数のスコープの外が配置されている場合、システムが自動的に私たちは、これらのスペースを再利用し、スタックメモリ空間上の要求、およびアプリケーション・ヒープ・スペースに、そして時に将来的に適切な範囲、私たちのようにする必要があり明示的に、我々はこれらのスペースのタイムリーなリリースを取得しない場合は、より多くのメモリの断片化のメモリなので、私たちの実際のメモリ空間をより多くなり、空きメモリ空間アプリケーションに削除を呼び出します以下、それは、メモリ・ブロック、ますます孤立しています。ここでは、リストを経由して(ヒープメモリ領域が連続していないか、我々はメモリの特定の部分に適用する場合は、有効メモリ領域のポインタ、リンクリストの後に、これが連続からメモリ領域になることを知っていますメモリのブロックオフ)まで我々が完成し使用している場合、それへのポインタがないので、解放されるようにタイムリーではない、それは、単独で開きますので、この領域はそう、メモリの断片化になります動的に割り当てられたメモリ(アプリケーションによるNEW)を使用した後、それが明示的に削除し、削除する必要があります。このために、私たちは忘れてはなりません。

それらの間のすべての人のために上記の考え方、両方の側面を使用するためにそれらを比較し、ここで私はそのことについて、述べて断続的にでき、誰も、詳細に記載されてネチズンのオンライン記事ではありませんが、また、専門的な色が付属しています次の資料は、作品の一部です。

 

アプリケーションのサイズ制限

スタック:スタックは下位アドレスデータ構造に展開されているWindowsでは、メモリの連続領域です。これは、スタックアドレスの最大容量とスタック所定のシステムがWindowsで、スタックサイズが2Mであり、良好であることを意味し、IF(一部は1Mは、要するに、コンパイル時定数で決定されると言います)宇宙アプリケーションがスタックに残っているスペースを超えたとき、あなたはオーバーフローするように求められます。したがって、より少ないスペースがスタックから得られます。

ヒープ:ヒープは、高アドレスデータ構造に拡張され、連続メモリ領域ではありません。システムは不連続な性質のアドレスを格納するための空きメモリのリンクリストで、リストのトラバース方向が低いから高いアドレスにあるためです。ヒープサイズは、コンピュータシステムの有効仮想メモリによって制限されます。したがって、空間利用可能なヒープより柔軟な、比較的大きいです。

アプリケーションの効率の比較:

スタックは自動的に速く、システムによって割り当てられます。しかし、プログラマが制御することはできません。

ヒープは、一般的に、よりゆっくりと、新しいメモリ割り当てであり、メモリの断片化が発生しやすいが、使用することが最も便利。

また、WINDOWSで、最良の方法は、メモリを割り当てるVirtualAllocのを使用することで、彼はヒープではありませんでした、またそれは、それが最も不便を使用しましたが、高速メモリは、プロセスのアドレス空間に直接スタックに予約されています。しかし、スピードだけでなく、最も柔軟性。

ヒープとスタックメモリの内容で

スタック:関数呼出し、スタックへの最初の主要な機能(関数呼び出し文で実行文)アドレス内の次の命令であり、ほとんどのコンパイラCに、様々なパラメータの関数です。引数は、ローカル変数の関数その後、右から左にスタックにプッシュされます。静的変数が押し込まれていないことに注意してください。

この関数呼び出し、ローカル変数の先入れ先出しスタックメモリの先頭アドレスへの最後のスタックポインタ点のパラメータを、次の命令の即ち主要な機能の終了後に、プログラムは、この時点から実行を継続します。

ヒープ:1バイトは、一般的にヘッドスタックのヒープサイズで保存されています。ヒーププログラマの配置の具体的な内容。

 

おすすめ

転載: blog.csdn.net/ll148305879/article/details/94391118