aligned_alloc
|
Definiert in Header
<stdlib.h>
|
||
| (seit C11) | ||
Reserviere size Bytes nicht initialisierten Speichers, dessen Ausrichtung durch alignment spezifiziert wird. Der size -Parameter muss ein ganzzahliges Vielfaches von alignment sein.
aligned_alloc
ist threadsicher: Es verhält sich so, als würde es nur auf die Speicherbereiche zugreifen, die durch sein Argument sichtbar sind, und nicht auf statischen Speicher.
Ein vorheriger Aufruf von
free
,
free_sized
, und
free_aligned_sized
(seit C23)
oder
realloc
, der einen Speicherbereich freigibt,
synchronisiert sich 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 freigebende Funktion und vor jedem Zugriff auf den Speicher durch
aligned_alloc
. Es gibt eine einzige Gesamtreihenfolge aller Allokations- und Deallokationsfunktionen, die auf jeden bestimmten Speicherbereich wirken.
Inhaltsverzeichnis |
Parameter
| alignment | - | gibt die Ausrichtung an. Muss eine gültige, durch die Implementierung unterstützte Ausrichtung sein. |
| size | - | Anzahl der zu allokierenden Bytes. Ein ganzzahliges Vielfaches von alignment |
Rückgabewert
Bei Erfolg gibt die Funktion einen Zeiger auf den Anfang des neu zugewiesenen Speichers zurück. Um einen Speicherverlust zu vermeiden, muss der zurückgegebene Zeiger mit free oder realloc freigegeben werden.
Bei Fehler wird ein Nullzeiger zurückgegeben.
Hinweise
Das Übergeben einer size , die kein ganzzahliges Vielfaches von alignment ist, oder eines alignment , das ungültig oder nicht durch die Implementierung unterstützt wird, führt dazu, dass die Funktion fehlschlägt und einen Nullzeiger zurückgibt (C11, wie veröffentlicht, spezifizierte in diesem Fall undefiniertes Verhalten, dies wurde korrigiert durch DR460 ). Die Aufhebung der Größenbeschränkungen, um die Allokation kleiner Objekte an restriktiven Ausrichtungsgrenzen zu ermöglichen (ähnlich wie alignas ), wurde vorgeschlagen durch N2072 .
Als Beispiel für die "vom Implementierung unterstützte" Anforderung 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
erben diese Anforderungen.
Grundlegende 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
aligniert Speicher, der für jeden Objekttyp mit einer grundlegenden Ausrichtung geeignet ist.
aligned_alloc
ist nützlich für überausgerichtete Zuweisungen, wie z.B. für
SSE
, Cache-Line-Grenzen oder
VM-Seitengrenzen
.
Diese Funktion wird in der Microsoft C-Laufzeitbibliothek nicht unterstützt, da deren Implementierung von
std::free
keine ausgerichteten Allokationen verarbeiten kann
jeglicher Art. Stattdessen bietet MS CRT
_aligned_malloc
(zu freigeben mit
_aligned_free
).
Beispiel
Mögliche Ausgabe:
default-aligned addr: 0x1e40c20 1024-byte aligned addr: 0x1e41000
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 7.22.3.1 Die aligned_alloc-Funktion (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.22.3.1 Die aligned_alloc-Funktion (S: 253)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.22.3.1 Die aligned_alloc-Funktion (S: 347-348)
Siehe auch
|
C++ Dokumentation
für
aligned_alloc
|