代码之家  ›  专栏  ›  技术社区  ›  allenhwkim

C-想知道程序中的最大内存可分配大小

c
  •  3
  • allenhwkim  · 技术社区  · 14 年前

    我是C区的新手

    所以我写了一个小程序如下。

    我有一台总内存16GB的机器,使用2GB,14GB是免费的。 我原以为这个程序会在14GB左右停止,但它永远运行。

    #include <stdlib.h>
    #include <stdio.h>
    
    int main(){
        long total = 0;
        void* v = malloc(1024768);
    
        while(1) {
            total += 1024768;
            printf ( "Total Memory allocated : %5.1f GB\n", (float)total/(1024*1024768) );
            v = realloc(v, total);
            if (v == NULL) break;
        }
    } 
    

    编辑:在CentOS 5.4 64位上运行此程序。

    3 回复  |  直到 14 年前
        1
  •  5
  •   strager    14 年前

    在大多数现代操作系统中,内存是为使用的每个页面分配的,而不是为“保留”的每个页面分配的。您的代码不使用任何页面,因此没有真正分配内存。

    尝试清除分配的内存 memset ;最终程序将崩溃,因为它无法再分配页面。

    我试图找到一个引证,但我没有成功。感谢您的帮助!

        2
  •  4
  •   Community CDub    7 年前

    你说运行应用程序的机器有16GB的内存,所以我假设它是64位的。这意味着您的应用程序将在耗尽1/物理内存和2/虚拟内存之前运行很长时间。

    在32位Windows上,应用程序将以4GB停止。在64位Windows上,您的应用程序将停止在16TB(假设您有一个可以自动增长的页面文件和这么多硬盘空间)。

    http://support.microsoft.com/kb/294418

    编辑 : ruslik 指出在实际操作中,进程将无法在32位窗口上分配高达2GB或3GB的内存(取决于二进制文件的编译方式)。从上面链接的KB文章中,您的进程占用的最大内存是3GB或4GB,1GB属于不能使用的OS。

        3
  •  1
  •   Vovanium    14 年前

    如果你在一个特定的平台/操作系统上,你应该使用报表函数,具体到那个操作系统。

    如果你是ERTIONG跨平台程序,你不应该依赖任何空闲内存检查算法。原因是:

    1. 操作系统可能由于自身原因拒绝提供所有可用内存:碎片、分配限制等等。
    2. 操作系统可能不会真正提供内存,只要分配空间,如果它有VMM。
    3. 算法可能会改变MM的内部状态,所以调用检查之前和之后可用的内存可能不同。