Я создал простую программу, которая распределяет целочисленный массив в куче / свободном хранилище каждый раз, когда пользователь нажимает «ввод». Моей конечной целью было увидеть изменение размера кучи памяти при каждом новом выделении. Я делаю это, проверяя файл состояния, чтобы увидеть изменение размера памяти кучи. К сожалению, при каждом выделении файл состояния не обновляется. Похоже, что единственный способ получить файл для обновления — это спамить программу с кучей возвратов каретки, а затем она обновляется. Почему это делает это? Мне нужен надежный метод для определения диапазона памяти, который мои программы занимают из динамического распределения, когда я работаю над встроенной системой. Может ли кто-нибудь предоставить какие-либо сведения о состоянии / proc // или другой метод определения размера кучи памяти?
Кроме того, статус предоставляет память в килобайтах, было бы неплохо увидеть эту информацию с большей детализацией в байтах — есть ли способ сделать это? Спасибо.
Вот пример программы того, что я сделал:
#include <cstddef>
#include <iostream>
int keepLooping()
{
return 1;
}
int main (int argc, char* argv[])
{
int exit_code = 0;
int fd = -1;
do
{
do
{
std::cout << '\n' << "Press a key to allocate data to the heap...";
} while (std::cin.get() != '\n');
int *someArray = new int[1000];
}
while (keepLooping());
return exit_code;
}
Реализации C ++ обычно не распределяют каждое динамическое выделение непосредственно из операционной системы, а скорее запрашивают целые страницы памяти (4 КБ по умолчанию в Linux) или более и распределяют меньшие выделения в процессе. Поэтому маловероятно, что операционная система сможет наблюдать небольшие изменения в использовании памяти процессом.
В некоторых системах, в частности, в Linux с определенной конфигурацией, распределение динамического хранилища не обязательно использует какие-либо системные ресурсы. Такие системы, которые за коммит память не видит каких-либо изменений в использовании физической памяти до тех пор, пока к выделенной памяти не будет получен доступ.
Есть инструменты профилирования памяти, такие как Valgrind который может использоваться для обертывания процесса и точного измерения использования памяти кучи на протяжении всего процесса.
Других решений пока нет …