Cómo asignar y la memoria libre en C alineados
-
20-09-2019 - |
Pregunta
¿cómo asignar la memoria que está alineado con un límite específico en C (por ejemplo, línea de caché límite)? Busco malloc / libre como la aplicación que lo ideal sería tan portátil como sea posible --- al menos entre 32 y 64 bits arquitecturas.
Editar para añadir: En otras palabras, estoy buscando algo que pudiera comportarse como función memalign, que puede ser liberado usando libre.
Solución
Aquí es una solución, que encapsula la llamada a malloc, asigna un búfer grande para el propósito de la alineación, y almacena la dirección asignada original, justo antes de la memoria intermedia se alinean para una llamada después de liberar.
// 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]);
}
Otros consejos
Uso 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
es un reemplazo estándar para memalign
que, como usted menciona es obsoleto.
¿Qué compilador está usando? Si estás en MSVC, puede intentar _aligned_malloc()
y _aligned_free()
.