0

コンピューターのメモリ、たとえば IA32 では、スタックの一般的な範囲はどのくらいですか? 0xffff1234 のようなアドレスがおそらくスタック上にあることはわかっています。たとえば、スタックが 0x0800abcd に成長する可能性はありますか? ヒープはどうですか?ヒープ アドレスが常にスタック アドレスよりも低いことはわかっていますが、通常、その範囲はどのくらいですか? また、ヒープの下の領域は何ですか?

スタック - プログラムが実際にプログラムを実行するために使用するメモリ。これには、ローカル変数、コールバック データ (たとえば、関数を呼び出すと、新しい関数に入る前の状態とコード内の場所がスタックに格納されます)、およびその性質のその他の小さなものが含まれます。通常、スタックを直接制御することはありません。変数とデータは破棄され、関数スコープに出入りするときに作成されます。

ヒープ - プログラムの「動的」メモリ。新しいオブジェクトまたは変数を動的に作成するたびに、ヒープに格納されます。このメモリはプログラマーによって直接制御され、そこでオブジェクトの作成と削除を処理する必要があります。

どうもありがとう!

4

1 に答える 1

0

スタック: リンク時のスタックのサイズを定義できます。私が知っているように、Windows アプリのデフォルトのスタック サイズは 2MB です。プロジェクト設定でスタックのサイズを変更できます。ただし、アプリがビルドされると、スタック サイズは固定されます。また、OS はスタック オーバーフローに対してガード ページを設定します。いずれかの操作でガード ページにアクセスしようとすると、EXCEPTION がトリガーされます。

ヒープ: デフォルトのヒープ サイズもプロジェクト設定で変更できると思います。アプリでは、独自のヒープを作成したり、CRT ヒープ、Win32 ヒープを使用したりできるためです。したがって、ヒープがたくさんあるはずです。メモリを割り当てようとすると、アルゴリズムに基づいてヒープ マネージャがメモリを割り当てます。十分なメモリがない場合、ヒープ マネージャは仮想メモリ マネージャからメモリを適用します。ユーザー アドレス空間に十分なメモリがなくなるまで、例外をスローします: メモリ不足。HeapNode、HeapSegment、LFH、LEA、BEA など、いくつかの定義があります。また、Windbg: !heap -s、!heap -a、これらのコマンドを使用して、Windows ヒープの構造を確認できます。

于 2013-09-04T10:15:26.573 に答える