メモリ割当プログラム

オペレーティングシステムによってスタック自動的に割り当てリリース  スタックのデータ構造と同様に動作パラメータの値、ローカル変数記憶機能等、

1ために定義された順序で定義されたローカル変数の関数は、連続可変である隣接アドレス間の他の変数は存在しない、スタックにプッシュ。

2.スタックとは反対側の端に高いからメモリアドレススタックの成長方向は、最初の変数によって定義された変数のアドレスは、以下に定義されます

データのライフサイクルに保存されている3スタックは、関数の実行が終了すると終了しました

ファイル割り当てられたプログラマのリリース、プログラマはOSによって、プログラムの最後に回収、解放しないならば、それは同様の配布リストに触れます

1.ヒープメモリアドレススタック成長がローからハイに反対の方向、メモリ空間のメモリ空間の背後に適用した後は、必ずしも先願ではないことに留意すべきです

その理由は、最初のアプリケーションのメモリ空間が解放されると、アプリケーションが関係を持って割り当てられたメモリ空間につながっている、以前に解放されたメモリは、アドレスに存在しないメモリ空間を使用することです

 

ヒープメモリ領域の割り当て方法について:

1.オペレーティング・システムは、レコードの空きメモリアドレスのリンクリストを持っています

2.システムは、アプリケーション・プロセスを受信すると、第一の空間は、要求ノードのヒープ領域より大きい見つける、リンクされたリストを横断します

3.自由ノードのリンクリスト、およびプログラムの空間に割り当てられたノードからノードを削除します

delete文のコードが正しく、このメモリ空間を解放するように、ほとんどのシステムでは、これは最初、この割り当てのメモリ空間のレコードサイズに対応します。

見つかったヒープ・ノードのサイズの大きさは、必ずしもアプリケーションに正確に等しくないので、システムに過剰の一部背面フリーリストに自動的になります

 

ヒープとスタックの違い:
:次のようにヒープと、実際に2つの管理オペレーティング・システム・プロセスのメモリ空間があり、いくつかの主要な違いがあるスタックがある
(1)異なる管理スタイルをスタックが自動的にオペレーティングシステムのリリースによって割り当てられ、我々は、手動で制御する必要はありません。作品のリリースのヒープとメモリリークが発生しやすいアプリケーションプログラマによって制御;

(2)空間的に異なるサイズ各プロセスは、スタックサイズは、ヒープのサイズよりもはるかに小さいました。理論的には、プログラマは、仮想メモリサイズのヒープサイズ、64-ビットWindowsのデフォルトの1メガバイト、Linuxのデフォルトの10メガバイトの64-ビットのプロセスのスタックサイズを適用することができます。

(3)異なる成長方向高いメモリアドレスに低いから上向きにパイルの成長;スタックの成長方向下、最高から最低のメモリアドレスへ。

(4)異なる分布ヒープはない静的に割り当てられたヒープ、動的に割り当てられています。

        スタック割り当ての2種類があります。

              静的割り当てとダイナミック割り当て。静的割り当ては、ローカル変数の割り当てとして、オペレーティング・システムによって行われます。

              動的allocaの割り当て関数によって割り当てられますが、動的なスタック割り当てとヒープは異なる、彼の動的割り当ては、オペレーティングシステムによって解放され、我々は、手動で実装する必要はありません

異なる(5)配布効率。

         スタックは自動的にハードウェアレベルでのスタックのためのサポートを提供する、オペレーティングシステムによって割り当てられている:特殊レジスタは、スタックは、スタックの効率が比較的高いと判断特別なプッシュ命令実行を有し、スタックのアドレスを含む割り当てます。

         スタックは頻繁にメモリ割り当てメモリの断片化しやすいアプリケーションと管理、より複雑な機構を完了するためにC / C ++ライブラリ関数またはオペレータによって提供されます。明らかに、スタックよりもはるかに低い効率をヒープ。

異なる(6)コンテンツを格納します。関数の戻りアドレス、パラメータ、ローカル変数やレジスタなどのためのスタックの内容。あなたは現在の関数の実行ブレークポイントを保存したいとき主な機能は、別の関数を呼び出すと、あなたが達成するために、スタックを使用する必要があり、

        図は、主な機能の次のステートメント、すなわち、拡張されたコンテンツポインタレジスタ(EIP)、および現在のスタックフレームの底アドレスの最初のアドレスであります

        次いで、即ち拡張ベースポインタレジスタの内容(EBP)と呼ばれる関数の引数、等に続く、通常の状況下で、右から左にスタックにプッシュされ

        ローカル変数と呼ばれる関数が続く、静的変数は、データ・セグメントに格納されているか、BSSが押し込まれていないことに注意してください。スタックの逆の順序、

        最後のポイントは、ステートメント、メインプログラムの主な機能で、かつ場所からスタックに対処し、実行を開始します。スタックは、一般に、ヒープのバイトサイズを格納するスタック領域の上部を使用し、プログラマが格納されているヒープ特定のコンテンツが取り込まれています。

それ以上のヒープとスタックに比べて見ることができることから、

:ヒープが大きいためにmallocに()/ free()をしたり、新しい/使用を削除し、メモリの断片化の大規模な量を引き起こす可能性が高い、とユーザーモードとカーネルモードの切り替えにつながる可能性があり、あまり効率的で

スタック:プログラムが広く使用されている中で、最も一般的な手順は、スタック関数の戻りアドレスにより実現される機能を呼び出すことで、EBPは、引数とローカル変数は、道のスタックを格納するために使用されています。

      スタックは、多くの利点がありますが、それは時々、主にヒープによって、メモリ空間の多くを割り当てると比較して柔軟性とヒープではありませんので、

 

ヒープまたは我々は違法クロスボーダーを防ぐために必要なスタックメモリの使用量は、不正なメモリアクセス違反がプログラムヒープの破壊につながるかどうかにいる間、期待どおりの結果を得ることができない、不確定な状態で実行するように、リードに至るまで、データをスタック例外をクラッシュさせるプログラムを引き起こし、これらは私たちのプログラムは、メモリの問題を扱うときに注意を払う必要があります

参考文献:

https://blog.csdn.net/K346K346/article/details/80849966

おすすめ

転載: www.cnblogs.com/allenhaozi/p/11109788.html