2017-08-04 3 views
18

Es existieren mehrere ausgerichtete Versionen des venerable malloc(), z.B .:Gibt es wirklich keine Version von realloc(), die Ausrichtung unterstützt?

#include <stdlib.h> 
int posix_memalign(void **memptr, size_t alignment, size_t size); 
void *aligned_alloc(size_t alignment, size_t size); 

#include <malloc.h> 
void *memalign(size_t alignment, size_t size); 

(Ursprung in POSIX, glibc und Linux libc respectively). Aber - ich finde keine Erwähnung einer Version von realloc(), die Ausrichtung unterstützt. Wurde es wirklich nie umgesetzt? Es scheint ziemlich trivial zu sein, die Funktionalität von nicht-ausgerichtetem realloc() mit der Suche nach einem ausgerichteten Speicherstück in den ausgerichteten malloc()-Varianten zu kombinieren.

Verwandte:

Does realloc keep the memory alignment of posix_memalign?

+0

Ja. Aus vielen Gründen gibt es keins. Eine besteht darin, dass die zugewiesenen zugewiesenen Funktionen keine Information über die Datengröße des allignierten Blocks speichern und keine Kopie von Daten möglich ist. Es wurde dem Anwendungsentwickler überlassen. Es gab viele Gründe dafür, sehr aktiv diskutiert vor vielen Jahren - siehe die entsprechenden Mailinglistenarchive für Details –

+3

@PeterJ: Sagen Sie, die ausgerichteten Zuordnungsfunktionen speichern _less_ Informationen als was 'malloc()' speichert? Ich bezweifle es sehr ... auf jeden Fall, wenn Sie dies mehr ausdrücken können, vorzugsweise mit einem Link zu einigen dieser Diskussion, bitte posten Sie eine Antwort. – einpoklum

+0

Nicht weniger. Das Thema ist zu kompliziert für das Forum. Durchsuchen Sie die Mailinglisten-Archive nach Erklärungen. –

Antwort

3

Aligned realloc nur in Microsoft mit der _aligned_realloc Funktion implementiert ist. Es ist keine POSIX-Version definiert und keine Implementierung in Linux. Ich habe aber nie verstanden warum, weil es in glibc nicht so kompliziert zu codieren scheint. Ich denke, es ist eine Frage der Zeit, bis jemand es implementieren wird, wenn man an die Einführung von SIMD-Befehlen denkt.

Im Moment einfach einen neuen Block ausgerichteten Speicher zuordnen, den Inhalt kopieren und den alten Zeiger freigeben. Dies sollte Ihre Anwendung trotzdem nicht verlangsamen.

+2

Würde +1 Ihnen geben, wenn Sie die letzte fallen gelassen haben Satz, ich bin nicht so ahnungslos ... auch, wenn möglich, wollen wir offizielle Quellen. – einpoklum

+2

Entweder Sie haben Ihren eigenen Speicherpool und können Ihren eigenen angepassten Realloc implementieren, entweder Sie verwenden memalign + memcpy + free, entweder können Sie auf eine hilfreichere Antwort warten, da Sie "nicht so ahnungslos" sind. – yakoudbz

Verwandte Themen