2009-09-21 6 views
4

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

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

+0

Быть разборчивым: наличие кучи является деталью реализации, C++ относится к свободному хранилищу. – dalle

+0

Вы правы, но я сделал это нарочно, так как «куча» представляется гораздо более общепринятым термином;) – Manuel

+0

Это не просто разница в терминологии. Свободный магазин не обязательно должен быть кучей. Это просто, но реализация решает разрешить запросы на распределение памяти. –

ответ

3

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

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

0

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

+0

Поскольку точность является обязательной, изображение представлено в памяти с поплавковыми значениями (32 бит), и всегда есть три канала (RGB или CiELab), которые приводят к 252 МБ, но это не так. Иногда приложение запускается с наибольшим выделяемым блоком, который должен быть 1.4Gb, иногда только 500Mb, а DLL, вызывающие большую часть фрагментации при более низком VA, - это загрузка «wintab32.dll» с 0x10000000. Доступное адресное пространство на 32-битных системах измеряется в гигабайтах, но не имеет значения, если у вас есть 3gb всего бесплатно в небольших кусках, фрагментация вызывает bad_alloc на машине 4gb-ram в любом случае ... – Manuel

+0

К сожалению, кажется, что однажды DLL загружается по адресу 0x10000000, каждая другая DLL передислоцируется рядом с этим VA: отключение планшета Wacom позволяет запускать другие DLL-файлы сверху, но всякий раз, когда используется нижний предел, загружаются другие DLL-файлы (такие как uxtheme.dll) рядом с ним. – Manuel

+0

Если вы не возражаете против изменения DLL, вы можете изменить его предпочтительную базу. В настоящее время 0x10000000 является особенно слабым дефолтом. – MSalters

0

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

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

Не очень, так как я хотел бы обнаружить ситуацию, хотя «работая», это может быть очень хорошо фрагментирует сама память. – Manuel