1

ヒープ領域が常にゼロに設定されるのはなぜですか?? 同様にスタックスペースがゼロに設定されないのはなぜですか??

4

4 に答える 4

4

ヒープ領域は常にゼロに設定されているわけではありません。

于 2009-07-07T17:15:48.853 に答える
4

答えは、使用している言語 (C++、Java など)、おそらくどのコンパイラ、そしてコンパイラ オプション (デバッグかリリースか) によって異なります。また、動作が保証されない場合があります (割り当てられたヒープは、最初に割り当てたときにゼロである可能性がありますが、後でプログラムが実行され、ヒープを再利用し始めた後、ゼロ化されていないメモリを [再] 割り当てていることに気付く場合があります)。 )。

于 2009-07-07T17:16:59.333 に答える
2

ヒープスペースがゼロに設定されている場合は、それが以前に使用されたことがないことが原因である可能性があります。ヒープ上にたくさんのものを割り当て、解放し、再割り当てした後、初期化されていないヒープスペースに古いデータのビットが表示されるようになります。

スタックには、呼び出しスタック内の他の関数からの古いローカル変数が含まれています。スタックは可能な限り効率的になるように設計されているため、古い変数の消去に時間を費やすことはありません。

また、0は必ずしも正しいイニシャライザーではないことを忘れないでください...それは賢明な選択です。独自に「正しい」ものは何もありません。ローカル変数のイニシャライザー値は常に​​明示的に設定する必要があります。

于 2009-07-07T19:17:27.860 に答える
2

あなたが見ているのは、与えられたものではなく、あなたの環境の成果物です。Cについて話していると仮定します。

ただし、ヒープからメモリを割り当てると、ゼロに初期化される場合とされない場合があります。C のような言語では、malloc はメモリが 0 に初期化されることを保証しませんが、calloc は保証します。ただし、実際には、多くのものを割り当てると、0 で埋められる傾向があります。なんで?プログラムがメモリを確保するためのスペースを使い果たすと、オペレーティング システムに追加のメモリを要求するためです。その際、オペレーティング システムは、最初のアクセスで実際に実体化して 0 で埋める一連の仮想ページをマッピングすることにより、メモリを提供します。ここで、ヒープ上のいくつかの値を解放し、malloc でさらに割り当てると、以前に書き込んだ「汚れた」メモリの一部が返される場合があります。すべてが 0 で初期化されると仮定すると、

したがって、明示的に初期化されたメモリを要求しない限り、0 に初期化されるヒープの fresg 領域に依存しないでください。

スタックがさらに悪い理由については、ヒープ上のスペースを再利用して、割り当てたばかりのメモリにランダムなノイズが発生するという同じ問題がスタックで発生しますが、関数呼び出しから戻った後、プログラムが上のスタック全体にたくさんのものを走り書きしただけで、わざわざそれを片付けませんでした。したがって、ほとんどの場合、上記の「汚い」ケースにいます。

最終的には、使用する予定のものはすべて、読み取る前に既知の状態に初期化されていることを確認することをお勧めします。

于 2009-07-10T17:51:40.260 に答える