32位Windows上c++应用程序可用的最大内存是多少?
What is the maximum memory available to a C++ application on 32-bit Windows?
不知道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上的虚拟地址空间
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存