在32位XP上分配超过1 GB的内存

我遇到了一个奇怪的问题,我的进程不能分配比似乎略低于1 GiB更多的内存。 当我的软件给出bad_alloc异常时,Windows任务管理器“内存使用情况”列显示的值接近1 GiB。 是的,我检查了传递给内存分配的值是合理的。 (没有竞争条件/腐败存在,会导致失败)。 是的,我需要所有这些记忆,而且无法绕过它。 (这是图像的缓冲区,无法进一步压缩)

我没有试图一次性分配整个1 GiB的内存,每个分配300 Mb左右。 这会造成问题吗? (我会试着看看是否让更小的分配工作更好)。 是否有一些编译器开关或其他我必须设置的才能通过1 GiB? 我见过其他人抱怨2 GiB限制,这对我来说会很好..我只需要更多一点:)。 我正在使用VS 2005 SP1,我在32位XP上运行它,并使用C ++。


在32位操作系统上,进程共有4GB地址空间。

在Windows上,有一半是禁止的,所以你的进程有2GB。

这是2GB的连续内存。 但它分散。 你的可执行文件被加载到一个地址,每个DLL被加载到另一个地址,然后是堆栈和堆分配等等。 因此,尽管您的进程可能具有足够的可用地址空间,但没有足够大的连续块来满足您对内存的请求。 所以做出更小的分配可能会解决它。

如果您的应用程序使用LARGEADDRESSAWARE标志进行编译,则它将被允许使用Windows剩余2GB的剩余空间。 (其价值取决于您的平台和环境。

  • 对于在64位操作系统上运行的32位代码,您将获得完整的4 GB地址空间
  • 对于在没有/ 3GB引导开关的32位操作系统上运行的32位代码,该标志完全没有意义
  • 对于使用/ 3GB启动开关在32位操作系统上运行的32位代码,您将获得3GB的地址空间。
  • 所以,如果你的应用程序能够处理它,设置标志总是一个好主意(它基本上是一个能力标志,它告诉Windows我们可以处理更多的内存,所以如果Windows也可以,它应该继续前进,给我们一样大的一个地址空间尽可能),但你可能不能依靠它有一个效果。 除非你使用64位操作系统,否则不太可能购买你。 (/ 3GB启动开关是必需的,并且已知会导致驱动程序出现问题,尤其是视频驱动程序)


    分配连续内存的大块总是一个问题。 很可能在更小的块中获得更多的内存

    你应该重新设计你的内存结构。


    您有理由怀疑较大的300MB分配。 如果使用/ 3GB boot.ini开关和LARGEADDRESSAWARE链接标志,您的进程将能够接近2GB(3个),但不能作为大的连续块。

    典型的解决方案是将请求分解成固定大小的块(例如256x256x4字节)并写入中间类来隐藏这种表示细节。

    您可以通过编写一个分配不同大小块的小分配循环来快速验证这一点。

    链接地址: http://www.djcxy.com/p/85071.html

    上一篇: allocate more than 1 GB memory on 32 bit XP

    下一篇: Java using more memory than the allocated memory