在C ++中以运行时返回可用虚拟内存的大小

时间:2010-04-13 12:07:04

标签: c++ windows

在C ++中是否有一个预定义的库函数,它将在运行时返回正在运行程序的计算机上当前可用的RAM大小?

例如,如果一个对象是4字节,那么我们可以将可用的虚拟内存除以4个字节,以便给出估计程序可以安全地存储多少个对象吗?

我使用了sizeof()函数来返回程序中对象的大小。

在有用的回复中经常要求这样做 - 程序运行的平台是Windows(7)。

由于

6 个答案:

答案 0 :(得分:6)

不在C ++标准库中 - 您的操作系统可能通过特定于平台的API提供此功能。

答案 1 :(得分:2)

C ++标准中没有任何内容可以返回可用的可用内存量。如果可以的话,这样的功能将是特定于平台的。

答案 2 :(得分:2)

首先,RAM的大小与进程中可用的可用虚拟内存量无关。只是如果由于频繁的页面错误导致RAM减少,程序将会变慢。此外,虚拟内存大部分都是碎片化的,因此找到诸如最大连续可用内存而不是总可用内存之类的内容更有意义。

没有内置的C ++函数可以使用OS API来实现它。例如,在Windows上,您可以使用Win32 API获取此信息。

答案 3 :(得分:2)

这是特定于平台的,而不是语言标准的一部分。

但是,有一个Windows特定的API来获取进程内存信息:GetProcessMemoryInfo()

此外,虚拟寻址允许进程分配超过总物理RAM。

答案 4 :(得分:1)

在Win32中,您可以使用

 MEMORYSTATUS st;
 ::GlobalMemoryStatus(&st);

答案 5 :(得分:1)

Windows中没有很好的解决方案。当程序释放堆块时,它几乎总是被添加到空闲块列表中。您只能通过使用HeapWalk()遍历堆来发现这些。这是昂贵的,并且对多线程程序的操作非常不利,因为你必须锁定堆。

此外,程序几乎永远不会耗尽可用的虚拟内存空间。它首先耗尽了一个足够大的空间,足以满足要求。除非您只进行非常小的分配,否则从HeapWalk获得的块大小总和没有意义。

想要这样的功能的最典型的原因是因为你的程序经常耗尽内存。有一个非常有效和廉价的解决方案可用于该问题。 200块钱买了64位版本的Windows。