malloc()用来跟踪分配大小的空间

The space that malloc() used to keep track of allocated size

本文关键字:空间 分配 跟踪 malloc      更新时间:2023-10-16

malloc()函数会在返回点之前的8个字节(在64位系统中)中放入一些信息——一些关于缓冲区大小的信息。但有一些差异,这比我预期的要大。

char *p = (char*)malloc(0x12345678);

前面的8个字节显示数字0x12346002

(gdb) x/32ubx p-8
0x7fffe56cf008: 0x02    0x60    0x34    0x12    0x00    0x00    0x00    0x00
0x7fffe56cf010: 0x68    0x65    0x6c    0x6c    0x6f    0x20    0x77    0x6f
0x7fffe56cf018: 0x72    0x6c    0x64    0x0a    0x00    0x00    0x00    0x00
0x7fffe56cf020: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00

想知道为什么有这么大的差异

malloc()函数会在返回点之前的8个字节(在64位系统中)中放入一些关于缓冲区大小的信息。

尽管这是实现内存管理例程的一种非常常见的方式,但它并不是通用的;例如,库可以保留一个单独的哈希表来跟踪分配大小。该标准允许库选择其首选的实现方法。

前面的8个字节显示数字0x12346002

暂时假设插入分配地址之前的8个字节不是未定义的行为(而实际上是)。为了优化潜在的realloc s,库可以根据自己的意愿对数字进行四舍五入。在这种情况下,库决定额外分配2442个字节,以备以后决定使用realloc

想知道为什么有这么大的差异

虽然从绝对数字来看,2442是一个很大的数字,但相对于分配的总体规模来说,这是一个很小的数字。