Портативный способ обнаружения фрагментации кучи в С++ во время выполнения?
Я пишу С++-приложение на основе 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;
}