Портативный способ обнаружения фрагментации кучи в С++ во время выполнения?
-
12-09-2019 - |
Вопрос
Я пишу приложение C++ на основе qt, и мне нужно иметь возможность обнаруживать фрагментацию памяти, чтобы проверить, может ли текущая система действительно выдерживать нагрузку на память:программа загружает большое изображение (15/21 мегапикселей является нормой) в память, а затем выполняет над ним некоторую фильтрацию (с разреженными матрицами).Например, у меня проблема с фрагментацией памяти в Windows, и VMMap очень помог в этом:проблема заключалась в том, что некоторые библиотеки DLL (планшет Wacom «wintab32.dll» и приложение UltraMon) не перемещаются, поэтому разделяют адресное пространство на 0x10000000-0x30000000 VA процесса.
Я хочу предоставить приложению некоторую осведомленность о проблеме фрагментации и задаться вопросом, существует ли уже кросс-платформенный (linux/mac/win32) подход, предоставляющий информацию, которую предоставляет VMMAP.
Решение
Короткий ответ:Портативного способа не существует.
Более длинный ответ:То, как реализована куча и как она работает, — это деталь реализации вашей реализации, которая сильно различается в зависимости от платформы, стандартных библиотек и операционных систем.Вам придется создать отдельную версию для каждой реализации — при условии, что реализация предоставляет вам 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;
}