Ich glaube nicht, dass das nur mit malloc möglich ist. Sie können memalign():
verwendenchar *data = memalign(PAGESIZE, alloc_size);
Wobei PAGESIZE
ist die Größe einer Seite und alloc_size
ist die Größe des zugewiesenen Speichers.
Die Größe der Seite kann mit sysconf(_SC_PAGESIZE)
ermittelt werden .
Dafür gibt es Funktionen, die Sie verwenden sollten.
Wenn Sie dies aus irgendeinem Grund nicht können, wird dies im Allgemeinen dadurch erreicht, dass Sie die Blockgröße zur Zuweisungsgröße addieren und dann ganzzahlige mathematische Tricks anwenden, um den Zeiger zu runden.
Etwa so:
/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size, size_t alignment)
{
const size_t mask = alignment - 1;
const uintptr_t mem = (uintptr_t) malloc(size + alignment);
return (void *) ((mem + mask) & ~mask);
}
Dies wurde nicht sehr gründlich getestet, aber Sie haben die Idee.
Beachten Sie, dass es unmöglich wird, den richtigen Zeiger auf free()
herauszufinden die Erinnerung später. Um das zu beheben, müssten wir einige zusätzliche Maschinen hinzufügen:
typedef struct {
void *aligned;
} AlignedMemory;
AlignedMemory * allocate_aligned2(size_t size, size_t alignment)
{
const size_t mask = alignment - 1;
AlignedMemory *am = malloc(sizeof *am + size + alignment);
am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
return am;
}
Dies umschließt die Zeiger-Tricks ein wenig und gibt Ihnen einen Zeiger, den Sie free()
verwenden können , aber Sie müssen in aligned
dereferenzieren Zeiger, um den richtig ausgerichteten Zeiger zu erhalten.