【问题标题】:Allocation of more than 2gb fails on 64 bit binary在 64 位二进制上分配超过 2gb 失败
【发布时间】:2014-02-03 14:47:02
【问题描述】:

在 64 位 linux 机器上,我编写了以下小 C 程序:

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

int main (void)
{
    #define BLOCK_SIZE (1024*1024)
    int i;

    for (i = 1; ; i++)
    {
        char *p = (char *)malloc(i * BLOCK_SIZE);
        if (p == 0)
            break;
        *p = 13;
        free(p);
    }

    printf ("Allocated max %d MB\n", (i - 1));

    return 0;
}

如果我用-O0 -m64 编译它,我可以在我的桌面系统上分配 2047 MB​​。如果我用-O0 -m32 3829 MB 编译相同的程序。

为什么在同一台机器上 32 位二进制文​​件的最大 malloc 大小比 64 位二进制文​​件大?

编辑:如果我使用-O3 激活优化器,则在 64 位机器上的最大内存量为 20588。

【问题讨论】:

  • 您是否只尝试过几次,或者您的程序多次(如数十次甚至数百次)运行的结果是否一致?此外,在启动后直接运行程序与让计算机运行几个小时甚至几天后的结果是否相似?

标签: c linux memory-management malloc


【解决方案1】:

您正在尝试将大于 2^31 的数字存储在有符号的 32 位 int 中。这个不合适。使用size_t 代替您传递给malloc 的大小。将i的类型改为size_t

【讨论】:

  • 通过该更正,我能够分配 32274 兆字节(Debian/Sid/x86-64、16GB RAM、16GB 交换空间)
猜你喜欢
  • 2013-03-25
  • 2013-04-10
  • 2017-01-30
  • 2013-01-24
  • 2010-11-15
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
相关资源
最近更新 更多