32位Windows上c++应用程序可用的最大内存是多少?

What is the maximum memory available to a C++ application on 32-bit Windows?

本文关键字:大内 内存 多少 Windows c++ 应用程序 32位      更新时间:2023-10-16

不知道c++应用程序使用的最大内存是否有限制

我知道这是2GB -这是正确的吗?

如果一个c++应用程序试图请求超过2GB的内存,这会导致内存崩溃吗?

最后一个问题-如果运行c++应用程序的机器内存已经很低,并且c++应用程序要求100MB的数组(即连续内存),操作系统会通过使用虚拟内存来适应这一点吗?

它将导致动态内存分配失败,这通常会导致应用程序崩溃,但从技术上讲,可以编写应用程序来承受此事件。2GB确实是单个进程的用户地址空间大小——一个应用程序可能使用多个进程(最简单的例子:Chrome)。如果应用程序请求100MB的连续内存,该内存必须是虚拟连续的,即使不是物理上连续的,如果没有足够的连续页面可用,则分配失败。

总是使用虚拟内存-所有内存都是虚拟的。

2GB是大多数情况下的限制。通常情况下,2GB的地址空间是给用户的,2GB的地址空间是给内核的,但是您可以要求Windows将这个3GB的地址空间留给用户,1GB的地址空间留给内核(有一定风险),而在64位地址空间上,整个4GB的32位地址空间都是给用户使用的。增加的地址空间只有在将应用程序编译为/LARGEADDRESSAWARE时才可用。

限制取决于操作系统。标准Linux是2gb, Solaris是3gb, Windows是(我被告知)2或3取决于如何使用PAE。

但是,您不能为您的数据获得所有2G。您的代码将占用一部分,您的程序堆栈将占用一部分,C库将占用一部分,您引用的任何其他共享库也将占用一部分。通常,操作系统会组织代码、堆和堆栈,使它们之间有意存在间隙。

至于你的最后一个问题:它都是虚拟内存。您实际上要问的是"如果我的机器中的程序使用了所有的物理内存,操作系统会使用交换内存吗?"答案是肯定的,但不是你想的那样。

CPU只能访问物理内存。它对存储在磁盘上的数据一无所知。因此,为了给一个正在运行的进程提供物理内存,操作系统将从另一个进程中获取内存。为了获取内存,它会将其写入swap。当其他进程需要访问内存时,操作系统会将其读入,可能会写入其他进程的内存来交换。

通常,32位操作系统只能寻址4GB的物理RAM。在实践中,这个限制往往会稍低一些,但可以通过使用虚拟RAM来缓解。在某些版本的Windows上,它可以通过使用物理地址扩展来增加。

对于您的问题更重要的是,在32位Windows上,用户应用程序可用的地址空间也有2GB的限制。这对单个应用程序可以使用的内存量造成了严格的限制,而不管可用的物理或虚拟RAM的数量。可以将默认的2GB限制增加到3GB。

下面的页面详细解释了这些限制:http://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx

虽然其他答案在通常情况下是正确的,但Windows XP 32位支持使用地址窗口扩展使用超过3GB的内存。

数据库服务器通常使用AWE来访问超大的内存集。它需要使用Win API来实际管理内存,所以显然最好只在真正需要的时候使用。

您可以访问的所有内存都是虚拟的-您不能直接从应用程序访问物理内存。操作系统将根据需要使用页面文件——如果有许多应用程序耗尽物理内存,您将看到的效果是增加交换,并明显减慢速度。

在win32位,应用程序有2GB的虚拟地址空间可用。这用于映射可执行文件和dll,例如内存映射文件,用于堆栈和堆。这个空间通常是碎片化的。如果您的应用程序构建为"大地址感知",并且操作系统是64位的,或者配置为将用户/内核模式内存分割为3/1GB,那么64位的地址空间几乎是4GB, 32位的地址空间几乎是3GB。

您可以分配的内存通常在17- 1800mb范围内。如果你分配小的部分,你会达到这个极限,如果你尝试分配大的连续块,你可能会更早达到极限,因为你的地址空间是碎片化的。

参见MSDN上的虚拟地址空间或Wikipedia上的虚拟地址空间