Erläuterung zur ausgerichteten Malloc-Implementierung

Dies ist keine Hausaufgabe, dies ist nur für meine persönliche Ausbildung.

Ich konnte nicht herausfinden, wie ein ausgerichtetes Malloc implementiert werden kanDiese Internetseit. Zum leichteren Lesen werde ich den folgenden Code posten:

#include <stdlib.h>
#include <stdio.h>

void* aligned_malloc(size_t required_bytes, size_t alignment)
{
    void* p1; // original block
    void** p2; // aligned block
    int offset = alignment - 1 + sizeof(void*);
    if ((p1 = (void*)malloc(required_bytes + offset)) == NULL)
    {
       return NULL;
    }
    p2 = (void**)(((size_t)(p1) + offset) & ~(alignment - 1));
    p2[-1] = p1;
    return p2;
}

void aligned_free(void *p)
{
    free(((void**)p)[-1]);
}

void main (int argc, char *argv[])
{
    char **endptr;
    int *p = aligned_malloc (100, strtol(argv[1], endptr, 10));

    printf ("%s: %p\n", argv[1], p);
    aligned_free (p);
}

Die Implementierung funktioniert, aber ich kann ehrlich gesagt nicht herausfinden, wie es funktioniert.

Hier ist, was ich nicht verstehen kann:

Warum brauchen wir einen Offset?Was macht anding mit~(alignment - 1) durchführenp2 ist ein Doppelzeiger. Wie kommt es, dass wir es von einer Funktion zurückgeben können, die nur einen einzelnen Zeiger zurückgeben soll?Was ist der allgemeine Ansatz zur Lösung dieses Problems?

Jede Hilfe wird sehr geschätzt.

BEARBEITE

Dies ist kein Duplikat vonWie reserviere ich den ausgerichteten Speicher nur mit der Standardbibliothek? weil ich auch wissen muss, wie man ausgerichteten Speicher freigibt.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage