如何查找malloc调用实际耗尽了多少内存?

Tyl*_*ler 4 c memory malloc memory-management

如果我打电话:

char *myChar = (char *)malloc(sizeof(char));
Run Code Online (Sandbox Code Playgroud)

我可能会使用超过1个字节的内存,因为malloc可能会自己使用一些内存来跟踪堆中的空闲块,并且它总是可以通过始终沿着某些边界对齐分配来节省一些内存.

我的问题是:有没有办法找出特定malloc调用真正消耗了多少内存,包括有效的对齐成本,以及malloc/ free?使用的开销?

为了清楚起见,我并没有要求在调用之后找出指针指向的内存量malloc.相反,我正在调试一个使用大量内存的程序,我想知道代码的哪些部分正在分配多少内存.我希望能够使内部记忆会计与top报告的数字非常接近.理想情况下,我希望能够以编程方式执行此操作malloc,而不是在检查点获取摘要.

caf*_*caf 8

没有可移植的解决方案,但是可能存在针对您感兴趣的环境的特定于操作系统的解决方案.

例如,glibc在Linux上,您可以使用返回a 的mallinfo()函数.在与该结构的成员包含该程序包括簿记开销使用动态分配的地址空间-如果你把这个区别每个之前和之后的呼叫,你就会知道的空间由呼叫使用量.(对于每次调用,开销不一定是恒定的).<malloc.h>struct mallinfouordblkshblkhdmalloc()malloc()

使用你的例子:

char *myChar;
size_t s = sizeof(char);
struct mallinfo before, after;
int mused;

before = mallinfo();
myChar = malloc(s);
after = mallinfo();

mused = (after.uordblks - before.uordblks) + (after.hblkhd - before.hblkhd);

printf("Requested size %zu, used space %d, overhead %zu\n", s, mused, mused - s);
Run Code Online (Sandbox Code Playgroud)

实际上,除非您进行非常大量的非常小的分配,否则开销很可能很小,无论如何这都是个坏主意.