何时使用虚拟内存(窗口)?

时间:2013-07-26 19:57:32

标签: c++ memory vector

我正在调试一个崩溃的程序,因为没有连续的内存可以用于我需要重新分配的vector。所以我有一个问题,为什么不使用虚拟内存?以何种方式使用虚拟内存?感谢。

3 个答案:

答案 0 :(得分:2)

虚拟内存由操作系统自动使用。你不需要关心这个。

在您的情况下,您最有可能运行32位应用程序。 Windows中32位进程的用户地址空间限制为2 GB(如果使用特定密钥启动Windows,则为3 GB)。如果你的向量需要超过几百兆的连续地址空间,这可能会成为一个问题(由于地址空间碎片)。

当然,任何进程都可能耗尽内存(即使使用虚拟内存和交换文件以及其他任何内容)。在任务管理器中查看程序的内存使用情况。

答案 1 :(得分:1)

虚拟内存是您在现代操作系统(Linux,Unix,Windows,MacOS,Symbian等)上运行的程序所能获得的唯一内存。

听起来你的问题是没有一个连续的虚拟地址范围对你的矢量来说足够大[1]。我怀疑发生的事情是,你需要一个32位进程超过1.5GB,一次只能使用2GB,所以在任何一端都没有多少“空间”来填充其他位之前“middle”小于1.5GB - 特别是,如果你有一个正在增长的矢量,你将需要两个矢量副本,一个是当前大小的副本,另一个是要复制的大小的两倍。

一个简单的解决方案,假设您知道向量需要多大才能设置它的大小,例如vector<int> vec(some_size);

如果您不知道,还有更多解决方案:

如果您有64位操作系统,可以尝试为可执行文件设置LARGEADDRESSAWARE标志(假设它是Windows)。这应该会给你更多的内存,因为64位操作系统不需要为操作系统本身预留大量的内存空间(它远远超出32位地址范围。在32位操作系统中,你需要使用/ 3GB启动操作系统,并设置上面的标志。

或者将代码编译为64位(在升级到64位操作系统之后,如果需要)。

[1]除非您正在编写驱动程序并尝试分配许多兆字节的物理内存作为缓冲区用于DMA - 但我想您会这么说。

答案 2 :(得分:0)

问题与内存无关,甚至与虚拟内存无关。阵列需要连续的地址范围。地址空间(通常在Win32程序中为2 GB)是碎片化的,因此没有足够大的可用空间。

如果您可以获取地址,Windows会自动提供虚拟内存以供其使用。

是时候将你的应用程序移动到64位了。