Nemyslím si, že je to možné pouze s mallocem. Můžete použít memalign():
char *data = memalign(PAGESIZE, alloc_size);
Kde PAGESIZE
je velikost stránky a alloc_size
je velikost paměti, která bude přidělena.
Velikost stránky lze zjistit pomocí sysconf(_SC_PAGESIZE)
.
K tomu existují funkce, které byste měli používat.
Pokud to z jakéhokoli důvodu nemůžete, pak se to obecně dělá tak, že se k velikosti alokace přidá velikost bloku a poté se ukazatel zaokrouhlí pomocí triku s celočíselnou matematikou.
Něco takového:
/* 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);
}
Toto nebylo příliš hluboce testováno, ale chápete to.
Všimněte si, že je nemožné zjistit správný ukazatel na free()
paměť později. Abychom to napravili, museli bychom přidat nějaké další zařízení:
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;
}
Tím se trik s ukazatelem trochu zabalí a získáte ukazatel, který můžete free()
, ale musíte provést dereferenci do aligned
ukazatel, abyste získali správně zarovnaný ukazatel.