Comment allouer et libérer de la mémoire alignées dans C
-
20-09-2019 - |
Question
Comment comptez-vous allouer de la mémoire qui est aligné sur une limite spécifique en C (par exemple, la limite de la ligne de cache)? Je cherche malloc / libre comme la mise en œuvre qui serait idéalement le plus portable possible --- au moins entre 32 et 64 architectures de bits.
Modifier pour ajouter: En d'autres termes, je suis à la recherche de quelque chose qui se comportent comme function memalign , qui peut être libéré en utilisant libre.
La solution
Voici une solution qui encapsule l'appel à malloc, alloue un tampon plus grand à des fins d'alignement, et stocke l'adresse allouée originale juste avant le tampon aligné pour un appel plus tard à libérer.
// cache line
#define ALIGN 64
void *aligned_malloc(int size) {
void *mem = malloc(size+ALIGN+sizeof(void*));
void **ptr = (void**)((uintptr_t)(mem+ALIGN+sizeof(void*)) & ~(ALIGN-1));
ptr[-1] = mem;
return ptr;
}
void aligned_free(void *ptr) {
free(((void**)ptr)[-1]);
}
Autres conseils
Utilisez posix_memalign
/ free
.
int posix_memalign(void **memptr, size_t alignment, size_t size);
void* ptr;
int rc = posix_memalign(&ptr, alignment, size);
...
free(ptr)
posix_memalign
est un remplacement standard pour memalign
qui, comme vous le mentionnez est obsolète.
Quel compilateur utilisez-vous? Si vous êtes sur MSVC, vous pouvez essayer _aligned_malloc()
et _aligned_free()
.