为什么下面的代码直接显示Mb占用的堆:
int Mb = 0;
while ( malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);
1<<20
是什么意思?
答案 0 :(得分:6)
1<<20
是什么意思?
A 1,向左移动20位,也称为2 ^ 20 = 1048576. <<
是向左移位的位移运算符。
答案 1 :(得分:6)
这意味着2^20
是1 MB。所以它计算MB的数量
答案 2 :(得分:2)
这是一个按位左移操作员。这意味着它占了一位(例如二进制00000001,除了31前导0)然后将该位移到20位置,留下2 ^ 20。
答案 3 :(得分:0)
在具有虚拟内存的现代操作系统上(例如大多数Unix,Linux,Windows),此代码实际上会向您显示虚拟内存大小的限制或过度使用限制(以先到者为准),而不是堆分配尺寸。它不断地分配更多的内存而不触及它,在这样做的同时创建一个小的内存泄漏(除非malloc
是预先初始化已分配内存的调试变体之一;然后,如果在Linux上运行,OOM杀手可能会杀死它甚至在它到达printf
)
在没有虚拟内存的(可能是现代的)操作系统上,它会显示在系统内存不足之前可以分配多少内存,而且一切都会崩溃并且不合理地烧毁。
答案 4 :(得分:0)
每次更改时都会打印MB的值
int Mb = 0;
while(malloc(1 <&lt; 20))
printf(“Allocated%d Mb total \ n”,++ Mb);
1&lt;&lt; 20是1兆字节的值(例如表示2 ^ 20):http://en.wikipedia.org/wiki/Megabyte
答案 5 :(得分: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(2 ^ 20字节,其他答案讨论移位运算符)时返回非空值的次数。动态保留内存在堆中分配,因此它计算堆可用的MB数。
虽然我不确定这种估计的精确度,但是因为malloc
不只是将指针移动到精确指示的大小。