アセンブリ言語でスタックとヒープの両方を使用するのはなぜですか?彼らは冗長に見える。なぜスタックとヒープがありますか?
答えて
彼らは冗長ではありません。それぞれに長所と短所があります:メモリ割り当てが簡単なので(プッシュ/ポップ)、スタックを使用すると高速です。欠点は、上部にある項目だけを追加したり削除したりできることです(したがって、名前、スタック)。また、スタックの総容量には限界があります。使い果たした場合、スタックオーバーフローが発生します。これとは対照的に、ヒープはランダムな割り当てと割り当て解除が可能で、そこに大量のデータを格納できますが、割り当てにはより多くのオーバーヘッドがあります - 割り当てられたメモリブロックごとに適切な空き部分が長期的には、空き領域の断片化を避ける必要があり、システムは空きブロックがどこにあるかを追跡する必要があります。
スタックを使用して、短命の短命値を渡すことができます。ローカルカウンタ変数、関数引数、戻り値など。これらは、配分スタイルをプッシュ/ポップするのに役立ちます。より長いまたは長いデータ構造の場合、ヒープを使用します。
メモリの操作と管理についてです。 x86アーキテクチャにはさまざまな種類のレジスタがあります。 x86アーキテクチャでは、ハードウェアでサポートされているメモリ管理の可能性があります。
スタックは命令ポインタで使用され、ヒープは一部のアプリケーションではデータセグメント用です。
では、次のリンクを読んでより多くのIアドバイスを読むには:は、 "メモリモデルコンパイラは、多くの重要な 最適化を実行することを可能にする" - ウィキペディアを
唯一のメモリモデルとしてどちらか一方を利用しているコンピューティングシステムを構築できます。しかし、どちらもそれぞれ違う性質を持っていて、それぞれが良い点と悪い点を持っています。ほとんどのシステムは、それぞれのメリットを得るために両方を利用しています。
スタック
スタックは、プレートの山と考えることができ、あなたは、プレート上の値を書き込み、これがプッシュ操作と保存上の値と呼ばれ、スタックの一番上に置きますスタック明らかにスタックからトッププレートを取り除くことができます。これはポップ操作と呼ばれます。しかし、新しい割り当ては常にスタックの最上位になければなりません。
スタックは、ローカル変数と関数間で値を渡すために使用される傾向があります。一般的にスタックは、次の素晴らしい特性を有する:
- は、ハードウェアで実装する
- が非常に簡単に管理するために、ポインタのほんの一握りが必要です、ほとんどのプロセッサはさらに速くそれを作るスタックのハードウェアサポートが組み込まれています。
- スタックに問題にメモリ
を割り当てることが非常に迅速には、アイテムのみ、スタックの最上位から削除/追加することができるという事実から来ています。スタックからのpop関数の入力、スタック上のローカル変数のための領域の割り当て、関数の実行、スタックの先頭からのローカル変数のクリア、スタックへの戻り値のプッシュ。一方、私はいくつかのメモリを割り当てて、別のスレッドに渡したり、一般的にどこに割り当てられているのかを突然私は問題があるので、スタックを正しい位置に置いてはいけませんメモリを解放する。
スタックは、高速シーケンシャルメモリ割り当てを容易にします。
ヒープ
今ヒープは、各割り当てが一般別々に追跡されている異なります。これにより、割り当てと割り当て解除に多くのオーバーヘッドが発生しますが、メモリが足りなくなるまで、他のメモリ割り当てとは独立してそれぞれを処理できます。
あり、これを達成するための多数のアルゴリズムがあり、おそらく、ここでそれらについてのTwitterは少しは賢明ではありませんが、ここでいくつかの良いシンプルなヒープ割り当てアルゴリズムについて語るのリンクです:Alternatives to malloc and new
だからヒープがランダム促進これには実行時のペナルティが伴いますが、ペナルティはしばしばスタックを使用して状況を処理する必要がある場合に発生するペナルティです。
- 1. NSObject:ヒープまたはスタックにありますか?
- 2. スタックまたはヒープにありますか?
- 3. .dataはmasmのスタックまたはヒープになりますか?
- 4. C++スタックとヒープの割り当て
- 5. スタックとヒープの割り当て
- 6. プログラミング言語のスタックとヒープ
- 7. QT - メインウィジェット - スタックまたはヒープ?
- 8. ヒープまたはスタックからのメモリ割り当てですか?
- 9. なぜ、多くのGUI CObjects(CButton)をスタックではなくヒープに置く必要があるのですか?
- 10. スタックとヒープと等価性テスト
- 11. ヒープ割り当てオブジェクトのデータメンバーは、ヒープまたはスタックに割り当てられますか?
- 12. Linuxはスタックとヒープの相互増殖を防ぎますか?
- 13. スタックとヒープのメモリ位置パターン
- 14. ヒープとスタックの問題 - Cプログラミング
- 15. DLLコールのヒープ/スタック破損
- 16. ブロック、スタック、およびヒープ
- 17. ポインタを渡す:スタックに異なる値がありますか?
- 18. パフォーマンスの問題、スタック、ヒープ、またはプロトタイプパターン?
- 19. C++メモリ管理で用語「スタック」と「ヒープ」より「自動」と「動的」という用語が好まれるのはなぜですか?
- 20. なぜF#デバッガがありますか?
- 21. なぜNullPointerExceptionがありますか?
- 22. なぜスタックはオーバーフローしますか?
- 23. スタックとヒープからメモリを解放する
- 24. スタックとヒープの違いは何ですか?
- 25. ヒープまたはスタックに参照が格納されていますか?
- 26. C#のValueTypeの配列がヒープまたはスタックに移動しますか?
- 27. openMPとの並列化 - スタックまたはヒープ変数
- 28. ヒープに2つの空のThreadAbortExceptionsがあるのはなぜですか?
- 29. なぜ "インポート"と "インポート*"に違いがありますか?
- 30. なぜ `.asInstanceOf`がスローされることはありますか?
これは良い質問ですが、既に回答済みです[こちら](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – Lars
...同様の質問は、Windowsに焦点を当て、答えた[ここ](http://stackoverflow.com/questions/2422252/windows-assembly-heap-and-stack)(他のオペレーティングシステムに固有なので、私は閉じるに投票していないしかし、それは近いコールです)。 – eran