我最近一直在用 C 进行实验,只是想了解硬件上发生了什么以及编译器在幕后做了什么。当我分配大量时,我的代码一直崩溃,我不确定为什么。我写了一个测试片段,看看我能做到多小。片段看起来像:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 400000000;
int* x = malloc(sizeof(int)*n);
if (x == NULL)
{
printf("isnull\n");
system("PAUSE");
return 0;
}
x[0] = 1;
for(int i = 1; i < n; i++)
{
x[i] = x[i - 1] + 1;
}
printf("%i\n", x[n - 1]);
system("PAUSE");
return 0;
}
我注意到一些事情:
首先这个尺寸好像接近极限了。 4 亿个元素不会使程序崩溃,但 5 亿个会。
我不相信我会达到整数溢出限制,但如果我将 n 更改为无符号,程序的行为相同。
我有足够的系统资源,5亿个整数应该只占用2GB,而我有接近8GB可用。
我仍然不确定为什么会这样,但是如果有人可以分享对此的见解,我将不胜感激。我一直在 Windows 10、MinGW GCC 9.2.0 上运行它
malloc
的结果,因为它可能会失败(并且您将取消引用 NULL 指针)。https://godbolt.org/z/96n9sbaMc
如果你需要在 Linux 中使用内存,请尝试增加交换文件的大小(即使是暂时的
swapon
),检查并设置系统限制(ulimit
)
堆内存是 ram 的一部分。您没有获得完整的 8GB 堆。为堆栈、变量、全局内容和堆预留空间,您必须牢记。