2

私はこれの唯一の欠点を見ます: あなたは StackOverflow を得ることができます :) Heap だけを使わないのはなぜですか?

Java、C、C++ では、関数へのパラメーターはスタックに渡されます。関数本体内のプレーン変数はスタックに作成されます。

私が知っているように、スタックはスレッドごとに制限されており、いくつかのデフォルト値がありますが、比較的低い: 1-8 Mb. スタックの代わりにヒープを使用しないのはなぜですか。どちらもメモリ内にあり、OS がアドレス A から B への分離を行うのはヒープであり、C から D への分離はスタックです。

可変引数があります。それぞれ4バイトの変数が10個あると言います。11 を読んだ場合、一部のデータを「メモリ」のゴミとして読み取る可能性があり、ハッキングに必要なデータを読み取るか、セグメンテーション違反が発生する可能性があります... OS があなたを不良少年として検出した場合。:) - したがって、セキュリティはスタックを使用する理由にはなりません。

4

6 に答える 6

6

パフォーマンスは多くの理由の 1 つです。スタック内のメモリは簡単に記録できます。穴がありません。キャッシュに直接マップできます。スレッドごとにアタッチされます。

対照的に、ヒープ内のメモリは、まあ、ものの山です。簿記が難しくなります。穴があっても構いません。

この回答(私の意見では素晴らしい)をチェックして、他のいくつかの違いを説明してください。

于 2013-10-26T17:21:54.280 に答える
2

これはオンラインで100万回回答されていると思いますが...

すべてのメソッド呼び出しをメモリ割り当て (低速) にしたくないためです。したがって、スタックを事前に割り当てます。

ここにリストされているその他の理由(セキュリティを含む)。

于 2013-10-26T17:19:52.383 に答える
1

newヒープを使用するには、または同様の関数を使用して、ヒープから少しのメモリを「要求」する必要があります。そして、それが終わったら、あなたdeleteはそれをもう一度やり直します。これは、長命の変数やかなりのスペースを占有する (または「コンパイル時に不明な」スペースを占有する) 変数に非常に役立ちます。たとえば、ファイルから変数に文字列を読み込む場合、どのくらいのスペースが必要かは必ずしもわかっていません。また、プログラムから「ファイル Y の行 X の文字列が大きすぎます」というメッセージが表示されるのは本当に面倒です)。

一方、スタックは、割り当てと割り当て解除の両方に関して「フリー」です (技術的には、スタック空間を使用する関数は、スタック空間の割り当てに 1 つの追加の命令が必要になりますが、数百またはへの呼び出しが関与する数千new、それは目立ちません)。もちろん、classオブジェクトはそれぞれのコンストラクターを呼び出す必要があり、完了するまでにほとんど時間がかかる場合がありますが、ストレージがどのように/どこから割り当てられたかに関係なく、これは当てはまります。

于 2013-10-26T17:28:11.463 に答える
1

すべてがスタック上にある場合、それらの値を渡すたびにコピーする必要があります。ただし、ヒープとは異なり、巧妙に管理する必要はありません。ヒープ上のアイテムにはガベージ コレクションが必要です。

そのため、2 つの異なる用途に適した 2 つの異なる方法で機能します。スタックは値を短時間保持するための迅速で軽量なホームですが、ヒープはオブジェクトをコピーせずに渡すことができます。

スタックもヒープも、すべてのシナリオに完全ではありません。そのため、両方が存在します。

于 2013-10-26T17:23:08.233 に答える
1

答えは、ヒープの割り当てと割り当て解除を行うと穴が開くからです。これは、使用可能な場所のサイズが異なるため、メモリの割り当てがますます難しくなることを意味します。スタックは必要なものだけを予約し、範囲外に出るとすべて返します。手間いらず。

于 2013-10-26T17:17:18.920 に答える