Namespaces
Variants

std:: aligned_alloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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:

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