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
想知道为什么会有这么大的差异
答案 0 :(得分:4)
malloc()
函数会在返回的点之前在8字节(在64位系统中)放置一些信息,以获取有关缓冲区大小的一些信息。
虽然这是实现内存管理例程的一种非常常见的方式,但它并不普遍;例如,库可以保留单独的哈希表来跟踪分配大小。该标准允许图书馆选择他们喜欢的实施方法。
它前面的8个字节显示数字0x12346002
假装片刻在分配的地址之前戳入8个字节并不是未定义的行为(实际上它是)。允许图书馆根据需要对数字进行舍入,以优化潜在的realloc
。在这种情况下,如果您决定稍后realloc
,则库决定分配2442个额外字节。
想知道为什么会有这么大的差异
虽然绝对数字2442很多,但与分配的整体规模相比,这个数字很小。