Namespaces
Variants

std:: align

From cppreference.net
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 im Header <memory>
void * align ( std:: size_t alignment,

std:: size_t size,
void * & ptr,

std:: size_t & space ) ;
(seit C++11)

Gegeben einen Zeiger ptr auf einen Puffer der Größe space , gibt einen Zeiger zurück, der an der spezifizierten alignment für size Bytes ausgerichtet ist, und verringert das space Argument um die Anzahl der für die Ausrichtung verwendeten Bytes. Die erste ausgerichtete Adresse wird zurückgegeben.

Die Funktion modifiziert den Zeiger nur, wenn es möglich wäre, die gewünschte Anzahl von Bytes, ausgerichtet an der gegebenen Alignment, in den Puffer einzupassen. Wenn der Puffer zu klein ist, tut die Funktion nichts und gibt nullptr zurück.

Das Verhalten ist undefiniert, wenn alignment keine Zweierpotenz ist.

Inhaltsverzeichnis

Parameter

alignment - die gewünschte Ausrichtung
size - die Größe des auszurichtenden Speichers
ptr - Zeiger auf zusammenhängenden Speicher (einen Puffer) von mindestens space Bytes
space - die Größe des Puffers, in dem operiert wird

Rückgabewert

Der angepasste Wert von ptr oder ein Nullzeigerwert, falls der bereitgestellte Speicherplatz zu klein ist.

Beispiel

Demonstriert die Verwendung von std::align zur Platzierung von Objekten unterschiedlichen Typs im Speicher.

#include <iostream>
#include <memory>
#include <new>
template<std::size_t N>
struct MyAllocator
{
    std::byte data[N];
    std::size_t sz{N};
    void* p{data};
    MyAllocator() = default;
    // Note: only well-defined for implicit-lifetime types
    template<typename T>
    T* implicit_aligned_alloc(std::size_t a = alignof(T))
    {
        if (std::align(a, sizeof(T), p, sz))
        {
            T* result = std::launder(reinterpret_cast<T*>(p));
            p = static_cast<std::byte*>(p) + sizeof(T);
            sz -= sizeof(T);
            return result;
        }
        return nullptr;
    }
};
int main()
{
    MyAllocator<64> a;
    std::cout << "allocated a.data at " << (void*)a.data
              << " (" << sizeof a.data << " bytes)\n";
    // Allocate a char
    if (char* p = a.implicit_aligned_alloc<char>())
    {
        *p = 'a';
        std::cout << "allocated a char at " << (void*)p << '\n';
    }
    // Allocate an int
    if (int* p = a.implicit_aligned_alloc<int>())
    {
        *p = 1;
        std::cout << "allocated an int at " << (void*)p << '\n';
    }
    // Allocate an int, aligned at a 32-byte boundary
    if (int* p = a.implicit_aligned_alloc<int>(32))
    {
        *p = 2;
        std::cout << "allocated an int at " << (void*)p << " (32-byte alignment)\n";
    }
}

Mögliche Ausgabe:

allocated a.data at 0x7ffc654e8530 (64 bytes)
allocated a char at 0x7ffc654e8530
allocated an int at 0x7ffc654e8534
allocated an int at 0x7ffc654e8540 (32-byte alignment)

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2377 C++11 alignment musste ein fundamentaler oder unterstützter erweiterter Ausrichtungswert sein muss nur eine Zweierpotenz sein

Siehe auch

alignof (C++11) fragt die Ausrichtungsanforderungen eines Typs ab
(Operator)
alignas (C++11) spezifiziert, dass der Speicher für die Variable um einen bestimmten Betrag ausgerichtet sein soll
(Spezifizierer)
(seit C++11) (veraltet in C++23)
definiert den Typ, der als nicht initialisierter Speicher für Typen gegebener Größe geeignet ist
(Klassentemplate)
informiert den Compiler, dass ein Zeiger ausgerichtet ist
(Funktionstemplate)