c – 在32位XP上分配1 GB以上的内存

前端之家收集整理的这篇文章主要介绍了c – 在32位XP上分配1 GB以上的内存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到一个奇怪的问题,我的进程不能分配比似乎略低于1 GiB.当我的软件发出bad_alloc异常时,Windows任务管理器“Mem Usage”列显示接近1 GiB的值.是的,我检查了传递给内存分配的值是否合理. (没有竞争条件/腐败存在,将导致失败).是的,我需要所有这些记忆,没有办法. (它是图像的缓冲区,不能进一步压缩)

我不是一次分配整个1个GiB内存,每个分配300个MiB.这会造成问题吗? (我会尝试看看是否使更小的分配更好地工作).有没有一些编译器开关或其他我必须设置为了超过1 GiB?我看到别人抱怨2 GiB限制,对我来说会很好.我只需要更多的一点:).我使用VS 2005与SP1,我运行它在32位XP,它在C.

解决方法

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

在Windows上,其中一半是禁用的,因此您的进程有2GB.

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

如果您的应用程序使用LARGEADDRESSAWARE标志进行编译,则允许使用剩余的2GB,尽可能多的Windows可以使用. (其价值取决于您的平台和环境.

>对于在64位操作系统上运行的32位代码,您将获得一个完整的4 GB地址空间
>对于32位操作系统而不使用/ 3GB引导开关的32位代码,该标志根本就不起作用
>对于32位操作系统上使用/ 3GB引导开关运行的32位代码,您将获得3GB的地址空间.

所以真的,设置标志总是一个好主意,如果你的应用程序可以处理它(它基本上是一个能力标志,它告诉Windows,我们可以处理更多的内存,所以如果Windows也可以,我们应该继续给我们一个地址空间),但你可能不能依靠它有一个效果.除非你使用64位操作系统,否则不太可能买你. (/ 3GB启动开关是必需的,并且已知导致驱动程序,特别是视频驱动程序的问题)

原文链接:https://www.f2er.com/c/116544.html

猜你在找的C&C++相关文章