-2

以下のコードがMbが占めるヒープを直接示している理由:

int Mb = 0;
while ( malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);

どういう意味1<<20ですか?

4

6 に答える 6

6

どういう意味1<<20ですか?

1は、左に20桁シフトされ、2 ^ 20 = 1048576<<とも呼ばれます。これは、左にシフトするビットシフト演算子です。

于 2012-11-02T20:50:19.877 に答える
6

2^20これは1MBを意味します。したがって、MBの数をカウントします

于 2012-11-02T20:50:23.253 に答える
2

これはビット単位の左シフト演算子です。これは、1ビット(たとえば、31の先行ゼロを除くバイナリ00000001)を取得し、そのビットを20の位置にシフトして、2^20を残すことを意味します。

于 2012-11-02T20:50:38.877 に答える
0

「以下のコードがMbが占めるヒープを直接示している理由」について

int Mb = 0;
while ( malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);
What is meant by 1<<20?

malloc()1MBを割り当てようとしたときにnull以外の値を返す回数を数えています(2 ^ 20バイト、他の回答ではシフト演算子について説明しています)。Dynamicalyに予約されたメモリはヒープに割り当てられるため、ヒープが使用可能なMB数をカウントします。

この見積もりの​​精度についてはわかりmallocませんが、正確に示されたサイズでポインタを移動するだけではありません。

于 2012-11-02T21:11:58.650 に答える
0

仮想メモリを備えた最新のオペレーティングシステム(ほとんどのUnix、Linux、Windowsなど)では、このコードは実際には、ヒープ割り当てサイズではなく、仮想メモリサイズの制限またはオーバーコミット制限(どちらか早い方)を示します。それに触れることなく常により多くのメモリを割り当てており、そうしている間に小さなメモリリークが発生します(malloc割り当てられたメモリを事前に初期化するデバッグバリアントの1つでない限り、Linuxで実行している場合、OOMキラーはメモリに到達する前にそれを強制終了する可能性がありますprintf)。

仮想メモリのない(おそらく最新の)オペレーティングシステムでは、システムのメモリが不足し、すべてがクラッシュして正常に動作しなくなる前に、割り当てることができるメモリの量が表示されます。

于 2012-11-02T20:57:22.273 に答える
0

これにより、変更されるたびにMBの値が出力されます

int Mb = 0;

while(malloc(1 << 20))

printf( "割り当てられた%dMb合計\n"、++ Mb);

1 << 20は1メガバイトの値です(たとえば、2 ^ 20を意味します):http://en.wikipedia.org/wiki/Megabyte

于 2012-11-02T21:01:26.423 に答える