(C) como um alocador de heap lida com um cabeçalho de bloco de 4 bytes, retornando apenas endereços com múltiplos de 8?

Parece não fazer sentido, a menos que apenas ignoremos qualquer excesso de espaço em potencial no início de um segmento e, em seguida, tenhamos o primeiro pedaço alocado no primeiro múltiplo de 8 (com o primeiro cabeçalho correspondente nesse endereço -4) . Isso deixaria, no entanto, muitos bytes antes disso não utilizados. Isso é o que geralmente é feito?

editar: obrigado a paxdiablo pela explicação detalhada abaixo. tudo isso faz sentido para cabeçalhos de 16 bytes. no entanto, estou trabalhando com um cabeçalho de 4 bytes, que se parece com isso:

struct mhdr {
    int size;  // size of this block
} tMallocHdr;

agora, se meu heap iniciar em um endereço múltiplo de 8, e qualquer endereço retornado por malloc precisar ser múltiplo de 8, e eu precisar usar cabeçalhos de 4 bytes, pareço ser forçado a 'desperdiçar' o primeiro 4 bytes da minha pilha. por exemplo:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
              ^
              (heap starts)

Se o heap iniciar na cenoura acima no endereço 8, usando o esquema de endereçamento neste exemplo, o primeiro endereço retornável que eu poderia retornar a um usuário após uma chamada malloc seria 16; Eu preciso de 4 bytes de cabeçalho, e o primeiro endereço que é um múltiplo de 8, que permite 4 bytes de cabeçalho é 16 (cabeçalho começa às 12). Isso significa que desperdicei os primeiros 4 bytes da minha memória heap interna para alinhar as coisas (8-11).

É um sacrifício aceitável, ou estou pensando nisso errado?

questionAnswers(3)

yourAnswerToTheQuestion