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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top