Wie zuzuteilen und ausgerichtete Speicher in C zu befreien
-
20-09-2019 - |
Frage
Wie kann man Speicher reservieren, die in C zu einer bestimmten Grenze ausgerichtet sind (zum Beispiel Cache-Zeilengrenze)? Ich suche nach malloc / free wie Implementierung, dass im Idealfall so portabel wie möglich sein würde, --- mindestens zwischen 32 und 64-Bit-Architekturen.
Bearbeiten, um hinzuzufügen: Mit anderen Worten, ich bin auf der Suche nach etwas, das wie verhalten würde? memalign Funktion, die frei befreit werden können.
Lösung
Hier ist eine Lösung, die den Aufruf von malloc kapselt, weist einen größeren Puffer für die Ausrichtung Zweck und speichert die Originalzugewiesene Adresse unmittelbar vor dem ausgerichteten Puffer für einen späteren Anruf kostenlos.
// 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]);
}
Andere Tipps
Mit 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
ist ein Standard-Ersatz für memalign
, die, wie Sie erwähnen, ist veraltet.
Was Compiler verwenden Sie? Wenn Sie auf MSVC sind, können Sie versuchen, _aligned_malloc()
und _aligned_free()
.