(C) ¿cómo maneja un asignador de montón un encabezado de bloque de 4 bytes, mientras solo devuelve direcciones que son múltiplos de 8?

No parece tener sentido, a menos que simplemente ignoremos cualquier exceso de espacio potencial al comienzo de un segmento, y luego tengamos el primer fragmento asignado en el primer múltiplo de 8 (siendo su primer encabezado correspondiente esa dirección -4) . Esto dejaría muchos bytes antes de eso sin usar. ¿Es eso lo que generalmente se hace?

editar: Gracias a paxdiablo por la explicación detallada a continuación. todo eso tiene sentido para encabezados de 16 bytes. Sin embargo, estoy trabajando con un encabezado de 4 bytes, que se parece a esto:

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

ahora, si mi montón comienza en una dirección que es un múltiplo de 8, y cualquier dirección devuelta por malloc debe ser un múltiplo de 8, y necesito usar encabezados de 4 bytes, parece que me veo obligado a 'desperdiciar' el primero 4 bytes de mi montón. por ejemplo:

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

Si el montón comienza en la zanahoria anterior en la dirección 8, utilizando el esquema de direccionamiento en este ejemplo, la primera dirección retornable que podría devolver a un usuario después de una llamada malloc sería 16; Necesito 4 bytes de encabezado, y la primera dirección que es un múltiplo de 8 que permite 4 bytes de encabezado es 16 (el encabezado comienza en 12). Esto significa que he desperdiciado los primeros 4 bytes de mi memoria interna de almacenamiento dinámico para alinear las cosas (8-11).

¿Es este un sacrificio aceptable, o estoy pensando en esto mal?

Respuestas a la pregunta(3)

Su respuesta a la pregunta