Quick'n'Dirty: измерить использование памяти?

Существует множество подробных инструкций по измерению использования памяти C++. (Пример ссылки внизу)

Если у меня есть программа, обрабатывающая и отображающая пиксельные данные, я могу использовать диспетчер задач Windows, чтобы обнаружить утечку памяти, если последовательная обработка/отображение/закрытие нескольких файлов означает, что память исполняемого файла (частный рабочий набор) увеличивается с каждой итерацией. Да, не идеально, но обработка тысяч кадров данных работает как быстрое и грязное решение.

Чтобы устранить ошибку памяти в этом (большом) проекте, я написал программу для точного измерения использования памяти, используя полезный ответ Ланзелота. А именно, часть под названием «Общая физическая память (ОЗУ)». Но если я вызову размер 1 double, я получу 577536. Даже если это цитата в битах, это много..

Я попытался написать стандартную программу болота, чтобы сделать паузу, выделить некоторую память (скажем, calloc данных на мегабайт) и снова сделать паузу, прежде чем освободить указанную память. Пауза достаточно длинная, чтобы я мог спокойно посмотреть на WTM. За исключением того, что исполняемый файл увеличивается только на 4 КБ (!) За одно выделение памяти.

Что мне здесь не хватает? Оптимизирует ли QtCreator или компилятор выделенную память? Почему большой сложный проект, по-видимому, допускает разрешение использования памяти до ~ 1 МБ, в то время как с любым размером памяти, с которым я бесплодно возился в своей простой программе, вообще не перемещается память, отображаемая в диспетчере задач Windows?

C++: измерение памяти использование из программы, Windows и Linux

https://stackoverflow.com/a/64166/2903608

--- Изменить --- Простой пример кода:

double *pDouble = (double*) calloc(1, sizeof(double));
*pDouble = 5.0;
qDebug() << "*pDouble: " << *pDouble;

Если я смотрю через WTM, это занимает 4K (будь то 1 или 1000000 двойных). С решением Lanzelot, к северу от 500k..


person PhilPhil    schedule 31.05.2018    source источник
comment
для этого требуется 4К - размер одной страницы памяти. Выделение памяти просто зарезервируйте память, как только вы коснетесь ее (назначите ей) - произойдет ошибка страницы, вы получите еще одну страницу в свое пространство процесса   -  person Severin Pappadeux    schedule 31.05.2018
comment
И я бы посоветовал перейти на ProcExp с sysinternals - это намного лучший способ наблюдать за вашими процессами, чем WTM.   -  person Severin Pappadeux    schedule 31.05.2018
comment
Правильный способ отследить ошибку памяти — использовать профайлер. Если вам нужно сделать это самостоятельно, то вы хотите переопределить оператор new и delete; но на самом деле используйте что-то вроде DrMemory или valgrind. Тогда вам не нужно быстрое или грязное расследование. Он просто говорит вам, где память была выделена, но не удалена   -  person UKMonkey    schedule 31.05.2018
comment
@SeverinPappadeux Таким образом, WTM просто показывает количество использованных страниц памяти (ну, умноженное на 4)? Похоже, это не соответствует потреблению памяти в моем большом проекте, который гораздо точнее отслеживает, сколько памяти используется.   -  person PhilPhil    schedule 04.06.2018
comment
@SeverinPappadeux Под ProcExp от sysinternals, вы имеете в виду это? docs.microsoft.com/en-us/sysinternals/downloads/   -  person PhilPhil    schedule 04.06.2018
comment
@UKMonkey DrMemory выглядит великолепно, к сожалению, моя программа 64-битная (очевидно, она не поддерживается в Windows). Valgrind был бы великолепен, поскольку он является частью QTcreator. Однако, по-видимому, его по-прежнему нельзя запустить в Windows. Хотел бы я, чтобы мне не приходилось так много программировать на C++ под Windows.. :-p   -  person PhilPhil    schedule 04.06.2018
comment
Да, этот ProcExp/procexp64   -  person Severin Pappadeux    schedule 04.06.2018
comment
Да, частные байты и рабочий набор находятся в страницах по 4 КБ, это атомарная единица подсистемы виртуальной памяти. Когда вы просите выделить несколько байтов, может произойти несколько результатов. Во-первых, память выделяется, а затем освобождается, поэтому malloc возвращает ее из внутренних буферов. Вы ничего не видите. Во-вторых, в буферах нет памяти, malloc их вырастит и вернет вам память, но в страницах вашего процесса память есть, опять же вы ничего не увидите. В-третьих, нет памяти в буферах и нет памяти на страницах процесса. Malloc зарезервирует память и попросит подсистему VM расширить адресное пространство — в страницах по 4K.   -  person Severin Pappadeux    schedule 04.06.2018