Pergunta

Como você aloca a memória alinhada a um limite específico em C (por exemplo, limite da linha de cache)? Estou procurando Malloc/Grátis, como a implementação que, idealmente, seria o mais portátil possível-pelo menos entre arquiteturas de 32 e 64 bits.

Editar para acrescentar: em outras palavras, estou procurando algo que se comportasse (o agora obsoleto?) Memalign função, que pode ser libertada usando gratuitamente.

Foi útil?

Solução

Aqui está uma solução, que encapsula a chamada para o MALLOC, aloca um buffer maior para fins de alinhamento e armazena o endereço alocado original pouco antes do buffer alinhado para uma chamada posterior para gratuitamente.

// 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]);
}

Outras dicas

Usar 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 é um substituto padrão para memalign O que, como você mencionou, é obsoleto.

Qual compilador você está usando? Se você está no MSVC, pode tentar _aligned_malloc() e _aligned_free().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top