(C) Wie behandelt ein Heap-Allokator einen 4-Byte-Blockheader, während nur Adressen zurückgegeben werden, die ein Vielfaches von 8 sind?

Es scheint keinen Sinn zu ergeben, es sei denn, wir ignorieren zu Beginn eines Segments einfach einen möglichen Speicherplatzüberschuss und lassen dann den ersten zugewiesenen Block beim ersten Vielfachen von 8 liegen (wobei der entsprechende erste Header diese Adresse -4 ist ). Dies würde jedoch viele Bytes davor ungenutzt lassen. Ist es das, was allgemein getan wird?

bearbeiten danke an paxdiablo für die detaillierte erklärung unten. Das alles macht Sinn für 16-Byte-Header. Ich arbeite jedoch mit einem 4-Byte-Header, der ungefähr so aussieht:

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

Nun, wenn mein Heap bei einer Adresse beginnt, die ein Vielfaches von 8 ist, und jede von malloc zurückgegebene Adresse ein Vielfaches von 8 sein muss und ich 4-Byte-Header verwenden muss, bin ich anscheinend gezwungen, die zu "verschwenden" Die ersten 4 Bytes meines Haufens. beispielsweise

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

Wenn der Heap bei der obigen Adresse 8 beginnt und das Adressierungsschema in diesem Beispiel verwendet, wäre die erste Adresse, die ich nach einem Malloc-Aufruf an einen Benutzer zurückgeben könnte, 16; Ich brauche 4 Bytes Header, und die erste Adresse, die ein Vielfaches von 8 ist, was 4 Bytes Header ermöglicht, ist 16 (Header beginnt bei 12). Dies bedeutet, dass ich die ersten 4 Bytes meines internen Heapspeichers verschwendet habe, um die Dinge in einer Linie anzuordnen (8-11).

Ist das ein akzeptables Opfer, oder denke ich darüber falsch nach?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage