aligned_alloc
| Definiert im Header <stdlib.h> |
||
| (seit C11) | ||
Allokiert size Bytes uninitialisierten Speichers, dessen Ausrichtung durch alignment spezifiziert wird. Der Parameter size muss ein ganzzahliges Vielfaches von alignment sein.
aligned_alloc ist threadsicher: Es verhält sich so, als ob nur auf die durch seine Argumente sichtbaren Speicherorte zugegriffen wird und nicht auf statische Speicherbereiche.
Ein vorheriger Aufruf von free, free_sized und free_aligned_sized(seit C23) oder realloc, der einen Speicherbereich deallokiert, *synchronisiert mit* einem Aufruf von aligned_alloc, der denselben oder einen Teil desselben Speicherbereichs allokiert. Diese Synchronisation erfolgt nach jedem Zugriff auf den Speicher durch die deallokierende Funktion und vor jedem Zugriff auf den Speicher durch aligned_alloc. Es gibt eine einzige Gesamtordnung aller Allokations- und Deallokationsfunktionen, die auf einen bestimmten Speicherbereich wirken.
Inhalt |
[edit] Parameter
| alignment | - | spezifiziert die Ausrichtung. Muss eine gültige, von der Implementierung unterstützte Ausrichtung sein. |
| size | - | Anzahl der zu allokierenden Bytes. Ein ganzzahliges Vielfaches von alignment |
[edit] Rückgabewert
Bei Erfolg wird ein Zeiger auf den Anfang des neu allokierten Speichers zurückgegeben. Um einen Speicherleck zu vermeiden, muss der zurückgegebene Zeiger mit free oder realloc deallokiert werden.
Bei einem Fehler wird ein Nullzeiger zurückgegeben.
[edit] Hinweise
Das Übergeben eines size, das kein ganzzahliges Vielfaches von alignment ist, oder eines alignment, das ungültig oder von der Implementierung nicht unterstützt wird, führt zum Fehlschlagen der Funktion und gibt einen Nullzeiger zurück (C11, wie veröffentlicht, spezifizierte in diesem Fall undefiniertes Verhalten, dies wurde durch DR460 korrigiert). Die Entfernung von Größenbeschränkungen, um die Allokation kleiner Objekte an restriktiven Ausrichtungsgrenzen zu ermöglichen (ähnlich wie bei alignas), wurde von N2072 vorgeschlagen.
Als Beispiel für die Anforderung "von der Implementierung unterstützt" akzeptiert die POSIX-Funktion posix_memalign jede alignment, die eine Zweierpotenz und ein Vielfaches von sizeof(void *) ist, und POSIX-basierte Implementierungen von aligned_alloc übernehmen diese Anforderungen.
Fundamentale Ausrichtungen werden immer unterstützt. Wenn alignment eine Zweierpotenz ist und nicht größer als _Alignof(max_align_t), kann aligned_alloc einfach malloc aufrufen.
Reguläres malloc richtet Speicher für jeden Objekttyp mit fundamentaler Ausrichtung aus. aligned_alloc ist nützlich für über-ausgerichtete Allokationen, z. B. für SSE, Cache-Zeilen oder VM-Seiten-Grenzen.
Diese Funktion wird in der Microsoft C Runtime-Bibliothek nicht unterstützt, da ihre Implementierung von std::free nicht in der Lage ist, ausgerichtete Allokationen zu handhaben. Stattdessen bietet MS CRT _aligned_malloc (zu deallokieren mit _aligned_free).
[edit] Beispiel
Mögliche Ausgabe
default-aligned addr: 0x1e40c20 1024-byte aligned addr: 0x1e41000
[edit] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 7.22.3.1 Die Funktion aligned_alloc (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 7.22.3.1 Die Funktion aligned_alloc (p: 253)
- C11-Standard (ISO/IEC 9899:2011)
- 7.22.3.1 Die Funktion aligned_alloc (p: 347-348)
[edit] Siehe auch
| C++ Dokumentation für aligned_alloc
|