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.

Était-ce utile?

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().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top