C++ 如果其他程序在64位windows中使用过多,32位程序是否真的会内存不足?

C++ 如果其他程序在64位windows中使用过多,32位程序是否真的会内存不足?,c++,c,memory,32bit-64bit,C++,C,Memory,32bit 64bit,我正在开发一个32位应用程序,出现内存不足错误 我注意到我的VisualStudio和一个插件(还有其他应用程序)使用了太多内存,大约4或5 GB 因此,我怀疑这些程序会耗尽我的程序能够找到可用内存的所有内存地址 我想32位只能使用前4 GB,其他内存根本无法使用 我不知道我的回答是否正确,否则我会寻找其他答案,就像我的代码中有bug一样。任何系统都可能因负载过重而崩溃 但在Windows和任何其他虚拟内存操作系统的正常使用中,其他程序的内存消耗不会对任何给定程序的执行产生太大影响 获取内存不足

我正在开发一个32位应用程序,出现内存不足错误

我注意到我的VisualStudio和一个插件(还有其他应用程序)使用了太多内存,大约4或5 GB

因此,我怀疑这些程序会耗尽我的程序能够找到可用内存的所有内存地址

我想32位只能使用前4 GB,其他内存根本无法使用


我不知道我的回答是否正确,否则我会寻找其他答案,就像我的代码中有bug一样。

任何系统都可能因负载过重而崩溃

但在Windows和任何其他虚拟内存操作系统的正常使用中,其他程序的内存消耗不会对任何给定程序的执行产生太大影响


获取内存不足错误是不常见的,但如果进行了大量分配或声明了大型局部自动变量,则可能会发生这种错误。如果无法正确释放不再使用的内存(即程序正在泄漏内存),也可能发生这种情况。对于64位机器上的32位程序而言,耗尽的不是内存本身,而是程序内的可用地址空间。

任何系统都可能因负载过重而停机

但在Windows和任何其他虚拟内存操作系统的正常使用中,其他程序的内存消耗不会对任何给定程序的执行产生太大影响

获取内存不足错误是不常见的,但如果进行了大量分配或声明了大型局部自动变量,则可能会发生这种错误。如果无法正确释放不再使用的内存(即程序正在泄漏内存),也可能发生这种情况。对于64位机器上的32位程序来说,耗尽的不是内存本身,而是程序内的可用地址空间。

您的声明

我想32位只能使用前4G字节,否则 它根本不能使用

这绝对是错误的。在64位操作系统中,由于虚拟内存到物理内存的转换表为64位,所有应用程序都可以使用所有内存,而不管它是什么位

一些真正古老的硬件可能不允许DMA处理4GB以上的地址,但我真的希望现在大部分都在垃圾场

如果整个系统的内存不足,则会对所有应用程序产生或多或少的影响

但是,默认情况下,32位应用程序只能使用较低的2GB虚拟地址范围(尽管这些2GB可以放置在物理内存中的任何位置,如上所述,通过64位转换表)。通过在链接命令中使用
/LARGEADDRESSAWARE
,您可以将其扩展到近4GB(32位操作系统中为3GB,在本例中受/3GB启动标志的约束),这只是告诉操作系统,您的应用程序将“理解”地址可以为负数,从而在地址超过2GB时可以正常运行

你的声明

我想32位只能使用前4G字节,否则 它根本不能使用

这绝对是错误的。在64位操作系统中,由于虚拟内存到物理内存的转换表为64位,所有应用程序都可以使用所有内存,而不管它是什么位

一些真正古老的硬件可能不允许DMA处理4GB以上的地址,但我真的希望现在大部分都在垃圾场

如果整个系统的内存不足,则会对所有应用程序产生或多或少的影响


但是,默认情况下,32位应用程序只能使用较低的2GB虚拟地址范围(尽管这些2GB可以放置在物理内存中的任何位置,如上所述,通过64位转换表)。通过在链接命令中使用
/LARGEADDRESSAWARE
,您可以将其扩展到近4GB(32位操作系统中为3GB,在本例中受/3GB启动标志的约束),这只是告诉操作系统,您的应用程序将“理解”地址可以为负数,从而在地址超过2GB时可以正常运行

32位程序的地址不能超过4GB,根据操作系统的不同,实际限制可能会低于4GB。而且,所有内存分配都是连续的,如果没有足够大的可用内存块,那么也会出现错误。@JoachimPileborg:continuoused in virtual space,不在物理空间中-重要区别。请注意,64位windows中的32位地址空间是一个虚拟地址空间,提供高达4Gb的可寻址内存位置,由操作系统逐页按需映射到物理RAM和/或内存映射文件。物理RAM页不必是连续的,其他程序/进程不会减少32位应用程序的虚拟地址空间,除非它调用进程内服务或进程内插件。我假设应用程序会产生内存不足错误,但现在我想知道为什么。您能更具体地说明您遇到的错误吗?具体地说,我有一个DirectX程序,当我调用IDirect3DSwapChain9::Present时,它会返回E_OUTOFMEMORY,而我的应用程序只使用了50 mb内存。一个32位程序的地址不能超过4GB,根据操作系统的不同,实际限制可能会低于此值。而且,所有内存分配都是连续的,如果没有足够大的可用内存块,那么也会出现错误。@JoachimPileborg:continuoused in virtual space,不在物理空间中-重要区别。请注意,64位windows中的32位地址空间是一个虚拟地址空间,提供高达4Gb的可寻址内存位置,由操作系统逐页按需映射到物理RAM和/或内存映射文件。物理RAM页面不必是连续的,其他程序/进程不会减少32位应用程序的虚拟地址空间,除非它调用进程内服务或进程内插件