Unix環境変数-ヒープとスタックの違い

(1)さまざまな管理方法:
プログラムの実行中、スタックはオペレーティングシステムによって自動的に割り当てられ、管理されます。プログラマーは、関数パラメーター値、戻り値、ローカル変数などを手動で制御する必要はありません。ヒープスペースの適用と解放はプログラマーによって手動で制御されるため、メモリリークが発生しやすくなります。

(2)スペースのサイズが異なります。
スタックは下位アドレスに拡張され、連続メモリ領域です。つまり、スタックの最上位のアドレスとスタックの最大容量は、システムによって事前に定義されています。要求されたスペースがスタックの残りのスペースを超えると、スタックオーバーフローエラーが発生します。ヒープは高アドレス拡張であり、不連続なメモリ領域です。システムはリンクリストを使用して空きメモリアドレスを格納し、リンクリストのトラバース方向は下位アドレスから上位アドレスに拡張されるためです。

(3)異なるフラグメント:
ヒープの場合、malloc / free(new / delete)を頻繁に行うと、必然的にメモリスペースに不連続性が生じ、メモリフラグメントが多数発生し、プログラムの運用効率が低下します。スタックの場合、連続したメモリスペースを割り当てる必要があります。

(4)割り当て方法が異なります。
ヒープはプログラムのmalloc / new関数によって動的に割り当てられ、free / delete関数によって解放されますが、スタックの割り当てと解放はオペレーティングシステムによって行われます。スタックの動的割り当ては、alloc()関数によって手動で行うことができますが、通常は手動操作の必要はありませんが、自動適用と解放のためにコンパイラーに渡されます。

(5)割り当て効率が異なり
ます。ヒープのメモリ割り当て効率は、スタックのメモリ割り当て効率よりもはるかに低くなります。スタックはオペレーティングシステムによって提供されるため、最下位のスタックをサポートし、スタックのアドレスを格納するための特別なレジスタを割り当てます。スタックをプッシュおよびポップするための特別な命令もあるため、実行効率は非常に高くなります。 。ヒープはC関数でサポートされており、そのメカニズムは比較的複雑です。たとえば、メモリブロックが割り当てられると、ライブラリ関数は特定のアルゴリズムに従ってヒープメモリスペースで使用可能な十分な大きさのメモリスペースを検索します。十分な連続スペースがありません。ヒープメモリを再配置するためのオペレーティングシステムが必要です。これにより、戻る前に十分なスペースを割り当てることができます。

おすすめ

転載: blog.csdn.net/Chiang2018/article/details/105444103