0

我为简单的测试编写了一个简单的代码。

#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有什么区别?)

4

2 回答 2

7

如果您的所有分配都成功,您将使用大约100000 * 1024 * 1024 * sizeof (List)字节,即(假设List是 4 字节,32 位指针)略高于390 GB

由于您引用的数字要低得多,因此可以安全地假设并非所有分配都真正成功。实际上,很难想象它们都在 32 位系统上成功......无论如何,您的代码从不检查这一点,所以很难说。

教训:malloc()可能会失败,如果不检查返回值,就不能假设分配成功。

另外,不要强制转换malloc()in C的返回值。

于 2013-10-17T13:08:55.880 回答
1

现代操作系统倾向于过度使用资源,并且仅在您使用资源时才实际执行分配。这是使用分页和页面错误为内存完成的。由于您从未通过 读取或写入您请求的内存malloc(),因此操作系统很可能从未映射任何页面。

尝试写入每个分配的缓冲区。读取可能还不够,因为它可以映射系统或进程范围的零页并依靠写时复制 (COW)来执行实际分配。这种情况经常发生。

即使那样,如果您为每个缓冲区分配的页面长度超过了页面的长度,您可能需要按页面执行一次写入以实际获取所有页面。

这样做并观察你的过程变得更胖。

于 2013-10-17T13:17:33.910 回答