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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top