我为一个简单的测试编写了一个简单的代码。
#include <stdio.h>
typedef struct
{
void* Data;
}List;
void x()
{
getchar();
int i;
List* myList[100000];
for(i = 0; i < 100000; i++)
{
myList[i] = (List*)malloc(sizeof(List)*1024*1024);
}
getchar();
for(i = 0; i < 100000; i++)
{
free(myList[i]);
}
}
int main()
{
x();
getchar();
return 0;
}
我看过“taskmgr”中的程序,我看过: - 540K - 4.500K - 544K(什么是4K差异?)
答案 0 :(得分:7)
如果您的所有分配都成功,您将使用大约100000 * 1024 * 1024 * sizeof (List)
个字节,这是(假设List
是4个字节,32位指针)略高于 390 GB
由于您引用的数字要低得多,因此可以安全地假设并非所有分配都实际成功。实际上,很难想象它们都会在32位系统上取得成功......无论如何,你的代码永远都不会检查它,所以很难分辨。
课程:malloc()
可能会失败,如果您不检查返回值,则无法假定分配已成功。
答案 1 :(得分:1)
现代操作系统倾向于过度使用资源,并且只有在您使用资源时才会实际执行分配。这是针对使用分页和页面错误的内存完成的。由于您从未通过malloc()
读取或写入您请求的内存,因此操作系统很可能从未映射过任何页面。
尝试将写入每个分配的缓冲区。读取可能还不够,因为可以映射系统或进程范围的零页面,并依靠写入时复制(COW)来执行实际分配。通常就是这种情况。
即便如此,如果为每个缓冲区分配的页面长度超过了页面长度,则可能需要执行每页 来实际获取所有页面。
这样做,看着你的过程变得更加肥胖。