Портативный способ обнаружить фрагментацию кучи в C ++ во время выполнения? - PullRequest
4 голосов
/ 21 сентября 2009

Я пишу приложение c ++ на основе qt, и мне нужно иметь возможность обнаруживать фрагментацию памяти, чтобы проверить, может ли текущая система действительно выдерживать нагрузку на память: программа загружает большое изображение (15/21 мегапикселя норма) в памяти, а затем выполнить некоторую фильтрацию по ней (с разреженными матрицами). Например, у меня проблема фрагментации памяти в Windows, и VMMap очень помог в этом: проблема заключалась в том, что некоторые библиотеки DLL (планшет Wacom "wintab32.dll" и приложение UltraMon) не перемещались, поэтому делят адресное пространство при 0x10000000-0x30000000 ВА процесса.

Я хочу предоставить приложению некоторую осведомленность о проблеме фрагментации и задаться вопросом, существует ли уже кросс-платформенный подход (linux / mac / win32), дающий информацию, предоставляемую VMMAP.

Ответы [ 3 ]

3 голосов
/ 21 сентября 2009

Краткий ответ: нет портативного способа.

Более длинный ответ: как реализована куча и как она работает, это деталь реализации вашей реализации, которая сильно различается между платформами, стандартными библиотеками и операционными системами. Вам придется создавать разные версии для каждой реализации - при условии, что реализация дает вам API для подключения к ней. (Который я думаю должен подходить для трех платформ, на которые вы ориентируетесь.)

0 голосов
/ 23 сентября 2009

Будет ли это делать то, что вам нужно?

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 голосов
/ 21 сентября 2009

Я думаю, что вы чрезмерно пессимистичны. 21 мегапиксель, даже если принять цветовую глубину 16 бит и альфа-канал одинакового размера, потребуется всего 168 МБ. Доступное адресное пространство в 32-битной системе измеряется в гигабайтах.

...