Comment allouer et libérer de la mémoire alignée en C

Comment allouer une mémoire alignée sur une limite spécifique en C (par exemple, limite de ligne de cache)? Je recherche une implémentation de type malloc / free qui, idéalement, serait aussi portable que possible – au moins entre les architectures 32 et 64 bits.

Modifier pour append: En d’autres termes, je recherche quelque chose qui se comporte comme la fonction memalign (maintenant obsolète?), Qui peut être libérée à l’aide de free.

    Voici une solution qui encapsule l’appel de malloc, alloue une mémoire tampon plus grande à des fins d’alignement et stocke l’adresse initialement allouée juste avant la mémoire tampon alignée pour un appel ultérieur à 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]); } 

    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 de memalign qui, comme vous le dites, est obsolète.

    Quel compilateur utilisez-vous? Si vous êtes sur MSVC, vous pouvez essayer _aligned_malloc() et _aligned_free() .