开发 32 位 C++ Windows 7 64 位中的应用程序

发布于 2025-01-03 13:05:48 字数 294 浏览 0 评论 0原文

我在 Visual Studio 2008 (C++) 中开发 Win32 应用程序。它在 32 位或 64 位 Windows 7 中运行良好。但是,有时我需要分配相当大的内存缓冲区(应用程序处理大量数据),如果我在 Windows 7 64 位中执行此操作,则会失败,在32位下运行良好。我所说的大内存缓冲区是指一个 ~250MB 和另一个 ~150MB。我的 PC 中安装了 8GB RAM,根据我的信息,64 位操作系统为 32 位应用程序提供了 4GB 可用内存。我不需要接近这个限制,但 malloc 仍然失败。 有什么想法为什么以及我能做些什么吗? 提前致谢。

I develop a Win32 application in Visual Studio 2008 (C++). It runs fine in either 32-bit or 64-bit Windows 7. However, sometimes I need to allocate quite big memory buffers (the application deals with lots of data), and if I do it in Windows 7 64-bit, it fails, in 32-bit it runs fine. By big memory buffers I mean one ~250MB and another ~150MB. I have 8GB RAM installed in my PC, and according to my information, the 64-bit OS makes 4GB availabla for a 32-bit application. I need nowhere near that limit, still malloc fails.
Any ideas why and what can I do about it?
Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

许你一世情深 2025-01-10 13:05:48

150MB 和 250MB 并不是特别大的分配。正如其他人所指出的,您遇到的问题很可能是地址空间碎片(即有足够的可用空间,只是不是全部都在一块)。

除了其他建议之外:

  • 程序启动后立即分配内存。地址空间将不太可能出现碎片。如果在程序的生命周期内分配这么多内存并不明智,请使用 VirtualAlloc 带有 MEM_RESERVE 标志以保留地址空间并稍后提交。
  • 如果进程启动后地址空间就出现碎片,则可能是由于 DLL 在无用的位置加载所致。您可以使用 VMMap 查看地址空间中发生的情况。如果属于您的 DLL 正在对地址空间进行碎片化,您可以对它们进行变基。

150MB and 250MB are not especially huge allocations. As others have noted, the problem you are hitting is most likely address space fragmentation (i.e. there is enough free space, it's just not all in one piece).

In addition to the other suggestions:

  • Allocate the memory as soon as the program starts. The address space will be less likely to be fragmented. If it wouldn't be sensible to allocate this much memory for the life of the program, use VirtualAlloc with the MEM_RESERVE flag to reserve the address space and commit it later.
  • If address space is fragmented as soon as the process starts, it's probably caused by DLLs loading at unhelpful locations. You can use VMMap to see what's happening in the address space. If DLLs belonging to you are fragmenting the address space you can rebase them.
偏爱你一生 2025-01-10 13:05:48

您正在达到 Win32 二进制文件中的虚拟地址空间限制。限制可能是 2 到 4 GB 取决于操作系统和环境。实际上,由于分配碎片,限制较少。

您的选择是:

  • 住在可以有效分配的空间内
  • 移动到 x64
  • 使用多个进程
  • 使用内存分配 API,该 API 允许将块取消映射/重新映射到应用程序虚拟地址空间,请参阅 文件映射:虚拟内存和虚拟地址空间 了解有关此内容的详细信息

You are hitting virtual address space limit in your Win32 binary. The limit might be 2 to 4 GB depending on OS and environment. Actualy limit is less due to allocation fragmentation.

Your choices are to:

落叶缤纷 2025-01-10 13:05:48

我认为win7-64下malloc有一个bug。我在三台机器上使用 32 位应用程序运行了相同的测试:XP32、w7-32 和 win7-64。它在 32 位平台上运行正常,但在 w7-64 下无法分配 110Mb 块。我已经对驱动器进行了碎片整理,并从干净的重新启动中再次尝试,得到了相同的结果。

K

I think there is a bug in malloc under win7-64. I have run the same tests with my 32-bit app on three machines: XP32, w7-32 and win7-64. It runs OK on the 32bit platforms but fails to allocate a 110Mb block under w7-64. I have de-fragmented my drive and tried again from a clean reboot with the same result.

K

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文