2

次のコードをコンパイルして実行すると:(cygwinでgccを使用)

int *a = malloc(1024*1024*100*sizeof(int));
while(1)
;

Windows XPのタスクマネージャは、このプロセスによるメモリ使用量を2232Kと表示します。これは、私によれば、約400000Kであるはずです。

次のコードをコンパイルして実行すると:(cygwinでgccを使用)

int *a = malloc(1024*1024*400*sizeof(int));
while(1)
;

メモリ使用量は1388Kに減少します。

したがって、増加を示すのではなく、実際には減少を示します。

これを説明できるのは何ですか?

4

6 に答える 6

7

メモリを割り当てて使用可能にしましたが、まだ使用していません(メモリの読み取りまたは書き込み)。メモリマネージャは、実際にはまだ物理メモリをプログラムに割り当てていない可能性があり、単にそれを使用できると言っただけです。割り当てたばかりのメモリ全体に何かを書き込む場合(たとえば、0で埋める-memsetを見てください)、メモリ使用量は期待どおりになると思います。

于 2009-07-11T14:38:29.617 に答える
4

2 番目の malloc は 1600MiB を割り当てます (ユニットを確認してください)。私の推測では、これはシステムが 1 つのプロセスで処理できる量を超えているため、2 番目の malloc は失敗します。何らかの理由で、malloc が失敗した場合でも、アプリケーション内の他のもののオーバーヘッドが高くなり、メモリ使用量が高くなります。

確かにaを印刷してください。

于 2009-07-11T14:40:16.977 に答える
3

残念ながら、メモリ消費は単一ほど単純ではありません。メモリを追跡する必要がある方法は多数あります (オペレーティング システムによって多少異なります)。

たとえば、Windows では、さまざまなメモリ使用タイプの一部を次に示します。

  • 仮想メモリ
  • 物理メモリ
  • コミットされたメモリ
  • 予約済みメモリ
  • 共有メモリ

正確にどの番号について話しているのか、詳細を教えていただけますか?

考えられる説明の 1 つは、プロセスの物理メモリの使用状況を見ていることです。オペレーティング システムは通常、仮想メモリ アドレスを割り当てますが、プロセスによって実際に使用されるまで物理メモリにコミットしません。

これを確認する 1 つの方法は、配列内のすべての要素に書き込む for ループを設定し、アプリケーションのメモリ使用量を確認することです。

于 2009-07-11T14:39:33.920 に答える
0

最適化が有効になっていて、実際には a が使用されていない場合、変数と割り当ての両方が削除されます。これは、変数を volatile として宣言することで回避できます。

于 2009-07-11T17:22:40.940 に答える
0

http://en.wikipedia.org/wiki/Copy-on-write

もう 1 つの用途は calloc 関数です。これは、物理メモリのページをゼロで埋めることによって実装できます。メモリが割り当てられると、返されるページはすべてゼロのページを参照し、すべてコピー オン ライトとしてマークされます。このようにして、プロセスに割り当てられる物理メモリの量は、データが書き込まれるまで増加しません。これは通常、より大きな割り当ての場合にのみ行われます。

于 2009-07-14T10:38:48.477 に答える
0

cygwin で malloc と gcc を使用した割り当て可能なメモリの問題は、次の場所で議論されています。http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html .

malloc からの戻り値を確認するのも良いでしょう。

于 2009-07-11T14:47:56.807 に答える