malloc
andfree
调用不仅仅是简单的包装器和sbrk
系统mmap
调用。这使得返回的东西与对andgetrusage
的调用不符。这些函数的任何重要实现都将在进程本身内部管理一个空闲列表,然后再考虑将任何内容返回给系统。malloc
free
程序调用free
(或delete
就此而言),并且内存不会立即返回给操作系统(可能永远不会)。free
-ed 内存可以被任务重用(如果它调用)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
and mmap
,并将舍入和开销视为malloc()
(and new
) 的分配内存的一部分。
使用 OSX 时,事情就不那么光明了。您可以查看苹果的 malloc() 的源代码,特别是 at 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 上不走运,除非有人可以纠正我。