puntero - Cómo asignar y liberar memoria alineada en C
punteros en c ejemplos (3)
¿Cómo asigna la memoria que está alineada a un límite específico en C (por ejemplo, límite de línea de caché)? Estoy buscando una implementación de tipo malloc / free que idealmente sería lo más portátil posible, al menos entre arquitecturas de 32 y 64 bits.
Editar para agregar: En otras palabras, estoy buscando algo que se comporte como la función memalign (¿ahora obsoleta?), Que se puede liberar usando gratis.
Aquí hay una solución, que encapsula la llamada a malloc, asigna un búfer más grande para propósitos de alineación, y almacena la dirección asignada original justo antes del búfer alineado para una llamada posterior para 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]);
}
Qué compilador estas usando? Si estás en MSVC, puedes probar _aligned_malloc()
y _aligned_free()
.
Utilice 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.