2009-09-21 61 views
4

我正在写一个基于QT的C++应用程序,我需要能够检测内存碎片,以检查当前系统是否实际上可以承受内存负载:程序加载一个大图像(15/21百万像素是规范)在内存中,然后对其执行一些过滤(w /稀疏矩阵)。 例如,我在Windows中有内存碎片问题,VMMap在这方面一直非常有帮助:问题是一些DLL(Wacom tablet“wintab32.dll”和UltraMon应用程序)没有得到重定位,所以拆分地址空间在过程的0x10000000-0x30000000 VA。在运行时检测C++堆碎片的便携方法?

我想为应用程序提供一些关于碎片问题的意识,并想知道给出信息VMMAP的跨平台(linux/mac/win32)方法是否已经存在。

+0

挑剔:堆的存在是一个实现细节,C++指的是免费商店。 – dalle 2009-09-21 09:39:35

+0

你是对的,但我故意这么做,因为“堆”似乎是一个更普遍接受的术语;) – Manuel 2009-09-21 09:52:36

+0

这不仅仅是术语上的差异。免费商店根本不需要堆。然而,只是实现决定解决内存分配请求。 – 2009-09-21 16:22:06

回答

3

简答:没有便携的方法。

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

0

我认为你过分悲观。 21百万像素,甚至假设16位色深和一个相等大小的alpha通道只需要168 MB。 32位系统上的可用地址空间以千兆字节度量。

+0

由于精度是必须的,图像在浮点值(32位)的内存中表示,总是有三个通道(RGB或CiELab)通向252MB,但这不是重点。 有时应用程序从最大可分配块开始为1.4Gb,有时仅为500Mb,导致在较低VA的大部分碎片的DLL是在0x10000000加载的“wintab32.dll”。 32位系统上的可用地址空间是以千兆字节为单位测量的,但是如果总共有3gb的小块可用,则无关紧要,碎片会导致4gb-ram机器上的bad_alloc ... – Manuel 2009-09-21 10:59:06

+0

不幸的是,似乎有一次在0x10000000处加载DLL时,每隔一个DLL就会在此VA附近重新定位:禁用Wacom平板电脑可以让其他DLL上推,但每当使用下限时,其他DLL(例如uxtheme.dll)就会加载靠近它。 – Manuel 2009-09-21 11:01:25

+0

如果您不介意更改DLL,则可以更改其首选基准。 0x10000000现在是一个特别糟糕的默认设置。 – MSalters 2009-09-21 11:11:06

0

这会做你所需要的吗?

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

    delete[] tst; 
    return true; 
} 
+0

不是真的,因为我想检测的情况,虽然“工作”,这样做可以很好地分割内存本身。 – Manuel 2009-09-23 10:00:10