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

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

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

3 ответа

Решение

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

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

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

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

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

   delete[] tst;
   return true;
}
Другие вопросы по тегам