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

Jac*_*ada 13 c++ windows 32-bit memory-limit

只是想知道C++应用程序使用的最大内存是否有限制

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

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

最后的问题 - 如果运行C++应用程序的机器已经内存不足而且C++应用程序要求100MB的阵列(即连续的内存),操作系统是否会通过虚拟内存来适应这种情况?

Pup*_*ppy 15

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

始终使用虚拟内存 - 所有内存都是虚拟内存.

在大多数情况下,2GB是限制.通常情况下,2GB用于用户,2GB用于内核,但是你可以要求Windows为用户提供3GB,为内核提供1GB(存在一定风险),在64位时,要求整个4GB的32位地址空间可供用户使用.增加的地址空间仅在您将应用程序编译为时才可用/LARGEADDRESSAWARE.


Ano*_*non 5

该限制取决于操作系统。标准 Linux 是 2 Gb,Solaris 是 3 Gb,Windows(据我所知)是 2 或 3,具体取决于 PAE 的使用方式。

但是,您无法获得全部 2G 数据。您的代码将占用其中的一些,您的程序的堆栈将占用一些,C 库将占用一些,您引用的任何其他共享库也将占用一些。通常,操作系统会组织代码、堆和堆栈,以便在它们之间故意留有间隙。

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

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