Tag: heapalloc

(C)堆分配器如何处理4字节块头,而只返回8的倍数的地址?

它似乎没有意义,除非我们忽略一个段开头的任何潜在的多余空间,然后让第一个分配的块位于8的第一个倍数(其对应的第一个头是该地址-4) 。 这将在未使用之前留下许多字节。 那是一般的做法吗? 编辑:感谢paxdiablo的详细说明如下。 这对16字节标题都有意义。 但是,我正在使用一个4字节的标题,看起来像这样: struct mhdr { int size; // size of this block } tMallocHdr; 现在,如果我的堆在一个8的倍数的地址上启动,并且malloc返回的任何地址需要是8的倍数,并且我需要使用4个字节的标题,我似乎被迫“浪费”第一个我的堆的4个字节。 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ^ (heap starts) 如果堆从地址8处的胡萝卜开始,使用此示例中的寻址方案,我可以在malloc调用之后返回给用户的第一个可返回地址为16; 我需要4个字节的标头,第一个地址是8的倍数,允许4个字节的标头是16(标题从12开始)。 这意味着我浪费了内部堆内存的前4个字节来排队(8-11)。 这是可以接受的牺牲,还是我在考虑这个错误?