如何获得可分配的最大可用内存块?

时间:2015-06-14 21:58:59

标签: c memory memory-fragmentation

如何在不返回malloc的情况下,在一次out of memory调用中获取应用程序可以分配的最大大小(连续)字节数? (最大可用块)

P.S。:如果我想分配它,如果我不想分配它,那么我想要两者的一般答案(所以这个问题不需要重新考虑)。

2 个答案:

答案 0 :(得分:4)

我认为你在询问(某种程度上)现代桌面或服务器操作系统。

问题是:返回结果时,任何答案都可能无效。原因是其他进程,线程,内存碎片等。 正如其他人已在评论中所述,操作系统甚至可能会报告比可用内存更多的内存 - 包括交换。这个想法是分配的内存可能只被进程稀疏地使用,因此只有实际访问内存页面才会被提供,malloc()本身不会提前预留任何内存。

分配尽可能多的内存通常也不是一个好主意,因为这可能导致过度交换或挨饿/摧毁其他进程。所以,只需分配你真正需要的内存。

**结论:**忘了吧!分配您需要的内存,而不是更多,而不是更少。如果你需要动态内存,可以考虑列表和树等动态结构,或者使用realloc()(但要仔细考虑)。

<强>旁注:

在返回NULL之前,不要试图尝试增加大小的已分配块。这很容易导致碎片化,您甚至可能无法分配以前最大的块大小(出于上述类似的原因)。

对于嵌入式操作系统,可能会有完全不同的答案。

答案 1 :(得分:-3)

下面的代码将提供一个近似的答案,特别是对于实时操作系统中的实时确定性内存分配器。它不是通用操作系统的目标:

#include <stdio.h>
#include <stdlib.h>

#define INCR 100000

int main(void){
    unsigned long i;
    for(i=1;;i=i+INCR) {
        void *ret = malloc(i);
        if (ret) {
            free(ret);
        }
        else {
            printf("malloc could not allocate memory of size: %ld bytes!\n", i);
            return 0;
        }
    }
}