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