C11 führt aligned_alloc
ein, das das Angeben einer Ausrichtung unterstützt. Es ist die Implementierung definiert, welche Ausrichtungen unterstützt werden, aber auf POSIX sollte es wie posix_memalign(3)
sein, was jede Zweierpotenz unterstützt, die ein Vielfaches von sizeof(void*)
ist.
Überlegen Sie auch, ob regulär malloc
ausreicht. malloc
hat eine Ausrichtung von _Alignof(max_align_t)
für alle Zuordnungen.
Falls C11 nicht verfügbar ist, gibt es posix_memalign(3)
. Wenn Sie Windows verwenden, gibt es eine _aligned_alloc
, die mit MSVC 2015 beginnt, oder verwenden Sie VirtualAlloc
und weisen Sie einen page-aligned Puffer zu.
Wenn keiner von beiden funktioniert, müssen Sie eine eigene Lösung auf malloc
rollen. Holen Sie die nächste ausgerichtete Adresse, speichern Sie die Ausrichtung für die beiden vorhergehenden Bytes. Wenn Sie Ihren freien Wrapper aufrufen, holen Sie sich die 2 vorhergehenden Bytes, subtrahieren Sie sie vom Zeiger und geben Sie das Ergebnis frei.
Sie ist effektiv 'bedeuten erzählt die Ausrichtung malloc'? – Downvoter
Wenn Sie den Zeiger ändern, den Sie erhalten haben, können Sie sich nicht daran erinnern oder zu ihm zurückkehren, um ihn zu "befreien". –
@Downvoter mehr oder weniger. Ich kann nicht memaligned oder so etwas verwenden. Ich kann das Original nicht aus dem alten berechnen. – AbstractDissonance