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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

   delete[] tst;
   return true;
}