punteros puntero memoria manejo ejemplos cadenas arreglos aritmetica c alignment memory-mapped-files memory-alignment

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.