6

我正在编写一个基于 qt 的 c++ 应用程序,我需要能够检测内存碎片,以检查当前系统是否可以实际承受内存负载:程序加载大图像(15/21 兆像素是标准)在内存中,然后对其执行一些过滤(使用稀疏矩阵)。例如,我在 Windows 中遇到内存碎片问题,而 VMMap 在这方面非常有帮助:问题是一些 DLL(Wacom 平板电脑“wintab32.dll”和 UltraMon 应用程序)没有重新定位,所以拆分地址空间在进程的 0x10000000-0x30000000 VA 处。

我想为应用程序提供对碎片问题的某种认识,并想知道是否已经存在提供 VMMAP 提供的信息的跨平台 (linux/mac/win32) 方法。

4

3 回答 3

3

简短的回答:没有便携的方式。

更长的答案:堆是如何实现的以及它是如何工作的,是您实现的实现细节,在平台、标准库和操作系统之间存在很大差异。您必须为每个实现创建一个不同的版本 - 前提是,该实现为您提供了一个 API 来挂钩它。(我认为您所针对的三个平台应该是这种情况。)

于 2009-09-21T09:30:29.553 回答
0

我觉得你太悲观了。21 兆像素,即使假设色深为 16 位和相同大小的 alpha 通道也只需要 168 MB。32 位系统上的可用地址空间以千兆字节为单位。

于 2009-09-21T10:39:08.083 回答
-1

这会做你需要的吗?

bool is_contiguous_freestore_available(size_t max)
{
   char* tst = new(std::nothrow) char[max];
   if (tst == null)
      return false;

   delete[] tst;
   return true;
}
于 2009-09-22T21:34:45.923 回答