动态内存分配限制

Limits on dynamic memory allocation

本文关键字:分配 内存 动态      更新时间:2023-10-16

我需要分配一个相当大的内存块(或多个块)——几千兆字节。但是,如果我尝试分配超过 532000000 个元素 (~2 Gb) 的浮点数组,则会出现运行时错误:

在抛出"std::bad_alloc"实例后终止调用 什么(): 标准::bad_alloc

没关系:

float* d = new float[532000000];

但这很糟糕(bad_alloc例外):

float* d = new float[533000000];

然后我尝试在第一个数组之外分配另一个数组。发现第二个浮点数组的最大大小为 195000000 个元素 (~748 Mb)。

没关系:

float* d = new float[532000000];
float* e = new float[196000000];

这很糟糕:

float* d = new float[532000000];
float* e = new float[197000000];

我想知道应用程序中分配的内存有哪些限制以及如何避免这些限制?如何使用虚拟内存?

我的系统 - 32 位 ubuntu 12.10,编译器 - gcc 4.7,内存 - 8GB(~6.5 Gb 免费)

您达到了虚拟地址空间的限制;即使您有足够的物理 RAM(操作系统可能可以使用 36 位指针通过 PAE 访问),在 32 位系统上,每个进程仍然具有 32 位虚拟地址空间,这意味着每个进程在内存中映射的内存不能超过 4 GB 的内存。

由于通常虚拟地址空间的上半部分(或上半部分 1 GB,取决于内核设置)是为内核保留的,因此通常会将分配限制设置为 ~2 GB,虚拟地址空间碎片可以降低此数字。

有多种解决方法(例如,在 Windows 上,您可以使用大于 4 GB 的内存映射文件,一次只映射其中的一部分;可能在 Linux 上也可以这样做),但目前最简单的解决方案是迁移到 64 位操作系统并将应用程序重新编译为 64 位。