Come allocare la memoria e allineati libera in C
-
20-09-2019 - |
Domanda
Come si allocare la memoria che è allineato a un limite specifico C (ad esempio, la linea di confine di cache)? Sto cercando malloc / libero come implementazione che idealmente sarebbe il più portabile possibile --- almeno tra i 32 e 64 architetture bit.
Modifica per aggiungere: In altre parole, sto cercando qualcosa che potesse comportarsi come funzione memalign, che può essere liberato usando liberi.
Soluzione
Ecco una soluzione, che incapsula la chiamata a malloc, alloca un buffer più grande per scopi di allineamento, e memorizza l'indirizzo originale assegnato poco prima che il buffer allineati per una chiamata successiva per liberare.
// 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]);
}
Altri suggerimenti
Usa 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
è un sostituto standard per memalign
che, come si parla è obsoleto.
Cosa compilatore stai usando? Se siete su MSVC, si può provare a _aligned_malloc()
e _aligned_free()
.