std::aligned_alloc
| Definiert in Header <cstdlib> |
||
| void* aligned_alloc( std::size_t alignment, std::size_t size ); |
(seit C++17) | |
Allokiert size Bytes uninitialisierten Speicher mit der durch alignment spezifizierten Ausrichtung (implizites Erstellen von Objekten im Zielbereich). Der Parameter size muss ein ganzzahliges Vielfaches von alignment sein.
Die folgenden Funktionen sind Thread-sicher erforderlich
- Die Bibliotheksversionen von operator new und operator delete
- Benutzerdefinierte Ersatzversionen von globalem operator new und operator delete
- std::calloc, std::malloc, std::realloc, std::aligned_alloc, std::free
Aufrufe dieser Funktionen, die eine bestimmte Speichereinheit zuweisen oder freigeben, erfolgen in einer einzigen Gesamtordnung, und jeder solche Freigabeaufruf happens-before die nächste Zuweisung (falls vorhanden) in dieser Ordnung.
Inhalt |
[bearbeiten] 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. |
[bearbeiten] Rückgabewert
Bei Erfolg wird ein Zeiger auf den Anfang des neu allozierten Speichers zurückgegeben. Um Speicherlecks zu vermeiden, muss der zurückgegebene Zeiger mit std::free oder std::realloc freigegeben werden.
Bei einem Fehler wird ein Nullzeiger zurückgegeben.
[bearbeiten] 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 ist, 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 durch DR460 korrigiert).
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 erben diese Anforderungen.
Fundamentale Ausrichtungen werden immer unterstützt. Wenn alignment eine Zweierpotenz ist und nicht größer als alignof(std::max_align_t) ist, kann aligned_alloc einfach std::malloc aufrufen.
Reguläres std::malloc richtet Speicher für jeden Objekttyp mit einer fundamentalen Ausrichtung ein. Diese Funktion ist nützlich für übermäßig 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 jeglicher Art zu verarbeiten. Stattdessen bietet MS CRT _aligned_malloc (freizugeben mit _aligned_free).
[bearbeiten] Beispiel
#include <cstdio> #include <cstdlib> int main() { int* p1 = static_cast<int*>(std::malloc(10 * sizeof *p1)); std::printf("default-aligned address: %p\n", static_cast<void*>(p1)); std::free(p1); int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024)); std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2)); std::free(p2); }
Mögliche Ausgabe
default-aligned address: 0x2221c20 1024-byte aligned address: 0x2222400
[bearbeiten] Siehe auch
| (seit C++11)(veraltet in C++23) |
definiert den Typ, der als uninitialisierter Speicher für Typen gegebener Größe geeignet ist (Klassenvorlage) |
| C-Dokumentation für aligned_alloc
| |