std:: aligned_alloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert in Header
<cstdlib>
|
||
|
void
*
aligned_alloc
(
std::
size_t
alignment,
std::
size_t
size
)
;
|
(seit C++17) | |
Allokieren Sie size Bytes nicht initialisierten Speichers, dessen Ausrichtung durch alignment spezifiziert wird ( implizites Erstellen von Objekten im Zielbereich). Der size -Parameter muss ein ganzzahliges Vielfaches von alignment sein.
Die folgenden Funktionen müssen Thread-sicher sein:
- Die Bibliotheksversionen von operator new und operator delete
- Benutzerersatzversionen 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 allozieren oder deallozieren, erfolgen in einer einzigen Gesamtordnung, und jeder solche Deallokationsaufruf happens-before der nächsten Allokation (falls vorhanden) in dieser Ordnung.
Inhaltsverzeichnis |
Parameter
| alignment | - | gibt die Ausrichtung an. Muss eine gültige, durch die Implementierung unterstützte Ausrichtung sein. |
| size | - | Anzahl der zu reservierenden Bytes. Ein ganzzahliges Vielfaches von alignment . |
Rückgabewert
Bei Erfolg gibt die Funktion den Zeiger auf den Anfang des neu zugewiesenen Speichers zurück. Um Speicherlecks zu vermeiden, muss der zurückgegebene Zeiger mit std::free oder std::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 ist oder nicht von der 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 ).
Als Beispiel für die Anforderung "vom 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 Anforderung.
Grundlegende 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 aligniert Speicher, der für jeden Objekttyp mit einer fundamentalen Ausrichtung geeignet ist. Diese Funktion ist nützlich für überausgerichtete Allokationen, wie z.B. für SSE , Cache-Line oder VM-Seiten -Grenzen.
Diese Funktion wird in der Microsoft C Runtime-Bibliothek nicht unterstützt, da deren Implementierung von
std::free
keine ausgerichteten Allokationen
jeglicher Art verarbeiten kann. Stattdessen bietet MS CRT
_aligned_malloc
(zu freigeben mit
_aligned_free
).
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
Siehe auch
|
(since C++11)
(deprecated in C++23)
|
Definiert den Typ, der als nicht initialisierter Speicher für Typen gegebener Größe geeignet ist
(Klassen-Template) |
|
C-Dokumentation
für
aligned_alloc
|
|