两种分配方法有什么区别?

时间:2012-07-05 07:45:28

标签: c malloc

我想测试当我请求24M内存时操作系统分配了多少。

    for (i = 0; i < 1024*1024; i++)
            ptr = (char *)malloc(24);

当我这样写的时候,我从top命令得到RES是32M。

    ptr = (char *)malloc(24*1024*1024);

但是当我做一点改动时,RES是244.它们之间有什么区别?为什么结果是244?

3 个答案:

答案 0 :(得分:7)

分配器有自己的关于簿记的数据结构,也需要内存。当您以小块(第一种情况)分配时,分配器必须保留大量有关每个块分配位置以及长度的附加数据。此外,您可能会在块之间得到未使用内存的间隙,因为malloc需要返回一个充分对齐的块,最常见的是在8字节边界上。

在第二种情况下,分配器只为您提供一个连续的块,并仅为该块进行簿记。

总是要小心大量的小分配,因为簿记内存开销甚至可能超过数据本身的数量。

答案 1 :(得分:6)

第二次分配几乎没有触及记忆。分配器告诉你“好吧,你可以拥有它”,但如果你实际上没有触摸内存,操作系统实际上从未给你,希望你永远不会使用它。有点像庞氏骗局。另一方面,另一种方法将一些东西(最多几个字节)写入许多页面,因此操作系统被迫实际为您提供内存。

尝试此验证,您应该使用大约24米:

memset(ptr, 1, 1024 * 1024 * 24);

简而言之,top并没有告诉你你分配了多少,即你从malloc询问的内容。它告诉您操作系统分配给您的进程。

答案 2 :(得分:0)

除了已经说过的话: 可能有些编译器会注意到如何在一个循环中分配多个24字节块,将它们的地址分配给同一个指针并仅保留您分配的最后一个块,从而有效地渲染每个其他malloc之前无用。所以它可以优化你的整个循环:

ptr = (char *)malloc(24);
i = 1024*1024;
相关问题