开发 32 位 C++ Windows 7 64 位中的应用程序
我在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
150MB 和 250MB 并不是特别大的分配。正如其他人所指出的,您遇到的问题很可能是地址空间碎片(即有足够的可用空间,只是不是全部都在一块)。
除了其他建议之外:
MEM_RESERVE
标志以保留地址空间并稍后提交。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:
MEM_RESERVE
flag to reserve the address space and commit it later.您正在达到 Win32 二进制文件中的虚拟地址空间限制。限制可能是 2 到 4 GB 取决于操作系统和环境。实际上,由于分配碎片,限制较少。
您的选择是:
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:
我认为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