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.