2016-07-24 31 views
1

malloc erlaubt keine willkürliche Ausrichtung. Wir können das selbst machen, aber wir haben eine andere Zeigerposition. Kostenlos erfordert das Original.Adjust malloc Zeiger

Gibt es eine Möglichkeit, malloc über den neuen Zeiger zu informieren, damit er sich anpassen kann und wir den alten Zeiger/Offset nicht speichern müssen?

+0

Sie ist effektiv 'bedeuten erzählt die Ausrichtung malloc'? – Downvoter

+0

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". –

+0

@Downvoter mehr oder weniger. Ich kann nicht memaligned oder so etwas verwenden. Ich kann das Original nicht aus dem alten berechnen. – AbstractDissonance

Antwort

2

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.

1

Nun, ich glaube, in C11 es ein solches Tier

Defined in header <stdlib.h> 

void *aligned_alloc(size_t alignment, size_t size);