Как измерить память, используемую в блоке или программе с C ++ - PullRequest
2 голосов
/ 07 февраля 2010

Каков наилучший способ измерения памяти, используемой программой на C ++ или блоком в программе на C ++. Таким образом, измерительный код должен быть частью кода и не должен измеряться снаружи. Я знаю о сложности этой задачи, поэтому она не должна быть точной на 100%, но, по крайней мере, она дает хорошее представление об использовании памяти.

Ответы [ 4 ]

2 голосов
/ 07 февраля 2010

Перегрузка new и delete - это, вероятно, путь. Не только на конкретный класс, но, возможно, более общий. Но вы также должны отметить, где сделаны new и delete. И есть какой-то запуск / сброс или что-то, чтобы отметить, теперь вы входите в этот блок, и теперь вы выходите из блока. А затем вам нужно сохранить историю, чтобы иметь возможность отслеживать ее после того, как это произошло.

2 голосов
/ 07 февраля 2010

Измерение на уровне блоков будет трудным (в лучшем случае), если вы не захотите явно добавлять инструментарий непосредственно в тестируемый код.

Я бы не стал начинать с перегрузок new и delete на уровне класса, чтобы попытаться это сделать. Вместо этого я бы использовал перегрузки ::operator new и ::operator delete. Это в основном верхушка воронки (так сказать) - все остальное управление динамической памятью в конечном итоге сводится к их вызову (и большинство делает это довольно напрямую). Таким образом, они, как правило, будут делать все возможное, чтобы рассказать вам об использовании динамической памяти программой в целом.

Основное время, когда вам нужно будет справиться с перегрузками new и delete для отдельного класса, будет, если они уже перегружены, поэтому они управляют отдельным пулом, и Вы заботитесь о том, сколько из этого пула используется в данный момент. В этом случае вам (примерно) нужно добавить инструментарий непосредственно к ним, чтобы получить что-то вроде высокой отметки об использовании ими памяти в течение заданного интервала.

1 голос
/ 07 февраля 2010

Как уже отмечали другие, вы можете перегрузить new и удалить, чтобы измерить объем выделенной памяти. Чтобы сделать то же самое для стека, если вы чувствуете себя авантюрным, вам придется сделать несколько ASM. В GCC в x86-64 получить позицию стека:

int64_t x = 0;
asm("movq %%rsp, %0;" : "=r" (x) );

Это поместит в x адрес указателя стека. Поместите это в несколько мест вокруг вашего кода и сравните значения до / после ввода блока.

Обратите внимание, что это может потребовать некоторой работы, чтобы получить то, что вы хотите, из-за того, как / когда компилятор может выделять память; это не так интуитивно или тривиально, как кажется.

1 голос
/ 07 февраля 2010

Переопределение уровня класса операторов new и delete - это то, что вам нужно.

...