【发布时间】:2023-03-13 21:16:02
【问题描述】:
背景:我正在编写一个处理大量地理数据的 C++ 程序,并希望一次加载大块以进行处理。我只能使用为 32 位机器编译的应用程序。我正在测试的机器运行的是 64 位操作系统(Windows 7)并且有 6 gig 的内存。使用 MS VS 2008。
我有以下代码:
byte* pTempBuffer2[3];
try
{
//size_t nBufSize = nBandBytes*m_nBandCount;
pTempBuffer2[0] = new byte[nBandBytes];
pTempBuffer2[1] = new byte[nBandBytes];
pTempBuffer2[2] = new byte[nBandBytes];
}
catch (std::bad_alloc)
{
// If we didn't get the memory just don't buffer and we will get data one
// piece at a time.
return;
}
我希望能够在应用程序达到 32 位寻址的 4 GB 限制之前分配内存。但是,当 nBandBytes 为 466,560,000 时,新的在第二次尝试时会抛出 std::bad_alloc。在这个阶段,进程的工作集(内存)值是 665,232 K 所以,我似乎无法获得甚至分配的内存。
有人提到 32 位 Windows 中的应用程序限制为 2 gig,使用 win32 的 /3GB 开关可以将其扩展到 3 gig。这是在那种环境下的好建议,但与本案无关。
在 64 位操作系统和 32 位应用程序下,您应该能够分配多少内存?
【问题讨论】:
-
我在网上找到了这个参考:“如果您在 64 位操作系统上作为 32 位应用程序运行,那么您将获得所有 4G 地址空间,所有这些都可以通过物理内存(如果你有 RAM),即使你自己没有使用 64 位指针。”来自博客:blogs.msdn.com/ricom/archive/2009/06/10/…
-
在我的 32 位机器上,我可以在简单的测试中分配 466,560,000×3 字节。在您的情况下,似乎是进程内存在分配点已经碎片化。
-
我很难选择一个答案来标记这个问题的正确性。我相信答案很复杂,取决于许多因素。内存映射文件是一个很好的答案,但这个问题的根本原因似乎是内存碎片。 bke1 指出了查看内存的好工具,很多人谈到内存碎片,但我选择了第一个明确说明问题并给出硬限制的答案(64 位下的 4 Gig 和正确的标志。)
-
感谢所有人,特别感谢提供优秀文章的链接。
-
进一步的测试揭示了这一点:我尝试将这个 ram 分配为 3000 件,但它在大约 95% 的地方失败了。比分 3 件更接近完成,但仍然没有运气。 VMMap 工具报告说我有 1.4 Gig 的可用空间,但仍然有 3000 块我无法分配 1.3 Gig。继续解决这个问题,我将尝试内存映射文件。
标签: c++ new-operator dynamic-memory-allocation