Вызовы malloc
и free
- это не просто тривиальные обертки вокруг системных вызовов sbrk
и mmap
.Это заставляет getrusage
возвращать то, что не соответствует вызовам malloc
и free
.Любая нетривиальная реализация этих функций будет управлять свободным списком внутри самого процесса, прежде чем думать о возврате чего-либо в систему.
Программа вызывает free
(или delete
в этом отношении), и память не сразу возвращается операционной системе (возможно, никогда).Память с free
может быть повторно использована задачей, если она вызывает malloc
, но не другими процессами.Это делает getrusage
правильным с точки зрения ОС, но не правильным с точки зрения программы.
В Linux вы можете использовать mallinfo()
#include <malloc.h>
#include <cinttypes>
std::size_t memsize()
{
auto data = mallinfo();
return data.arena - data.fordblks + data.hblkhd;
}
Здесь,memsize()
вернет количество байтов, выделенных с точки зрения программы.Он учитывает различные методы выделения, такие как sbrk
и mmap
, и рассматривает округление и издержки как часть выделенной памяти malloc()
(и new
).
С OSXвсе не так ярко.Вы можете взглянуть на исходный код яблочной функции malloc () и, в частности, на mstats
, в котором говорится в комментарии:
/*
* A Glibc-like mstats() interface.
*
* Note that this interface really isn't very good, as it doesn't understand
* that we may have multiple allocators running at once. We just massage
* the result from malloc_zone_statistics in any case.
*/
Это не выглядит многообещающе и:
#include <malloc/malloc.h>
#include <cinttypes>
std::size_t memsize()
{
auto data = mstats();
return data.bytes_used;
}
По моим экспериментам выглядит не очень хорошо.Но это может быть лучше, чем ничего, или просто полагаться на getrusage
.Я думаю, что вам не повезло на OSX, если кто-то не может исправить меня.