以下のコードがMbが占めるヒープを直接示している理由:
int Mb = 0;
while ( malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);
どういう意味1<<20
ですか?
以下のコードがMbが占めるヒープを直接示している理由:
int Mb = 0;
while ( malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);
どういう意味1<<20
ですか?
どういう意味
1<<20
ですか?
1は、左に20桁シフトされ、2 ^ 20 = 1048576<<
とも呼ばれます。これは、左にシフトするビットシフト演算子です。
2^20
これは1MBを意味します。したがって、MBの数をカウントします
これはビット単位の左シフト演算子です。これは、1ビット(たとえば、31の先行ゼロを除くバイナリ00000001)を取得し、そのビットを20の位置にシフトして、2^20を残すことを意味します。
「以下のコードが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
ませんが、正確に示されたサイズでポインタを移動するだけではありません。
仮想メモリを備えた最新のオペレーティングシステム(ほとんどのUnix、Linux、Windowsなど)では、このコードは実際には、ヒープ割り当てサイズではなく、仮想メモリサイズの制限またはオーバーコミット制限(どちらか早い方)を示します。それに触れることなく常により多くのメモリを割り当てており、そうしている間に小さなメモリリークが発生します(malloc
割り当てられたメモリを事前に初期化するデバッグバリアントの1つでない限り、Linuxで実行している場合、OOMキラーはメモリに到達する前にそれを強制終了する可能性がありますprintf
)。
仮想メモリのない(おそらく最新の)オペレーティングシステムでは、システムのメモリが不足し、すべてがクラッシュして正常に動作しなくなる前に、割り当てることができるメモリの量が表示されます。
これにより、変更されるたびにMBの値が出力されます
int Mb = 0;
while(malloc(1 << 20))
printf( "割り当てられた%dMb合計\n"、++ Mb);
1 << 20は1メガバイトの値です(たとえば、2 ^ 20を意味します):http://en.wikipedia.org/wiki/Megabyte