我很想知道我可以在笔记本电脑上分配多少内存,因此我运行了极简主义程序:
#include<stdio.h>
#include<stdlib.h>
int main() {
int Gb = 0;
while ( malloc(1<<30) ){
++Gb;
printf("Now allocated %d Gb in totaln", Gb);
}
}
它应该在每一步分配 1Gb 的内存,直到 malloc 失败 (NULL(,结束循环。 另一方面,我获得的输出以以下结尾:
现在总共分配了 131063 Gb
而且这绝对不是真的(我有 8Gb 的 RAM 并且没有交换分区(。 我能问一下,我误解了什么吗?
编辑:我忘了提到,我正在使用Linux。
虚拟内存的奇迹。在你以某种方式实际初始化它之前,内存不需要占用任何 RAM。你会得到一个截然不同的结果
#include <stdio.h>
#include <stdlib.h>
int main(void) {
unsigned num_blocks = 0;
for (char *p; ( p = malloc(1<<30) ); ) {
memset(p, 0, 1<<30); // <-----
++num_blocks;
printf("Now allocated %u GiB in totaln", num_blocks);
}
}
分配比计算机具有物理内存更多的虚拟内存称为内存过度使用。
在文章 Linux 中的虚拟内存设置 - 过度提交的问题中可以找到一些有趣的信息。