Namespaces
Variants

std:: aligned_storage

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
aligned_storage
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definiert im Header <type_traits>
template < std:: size_t Len, std:: size_t Align = /* default-alignment */ >
struct aligned_storage ;
(seit C++11)
(veraltet in C++23)

Stellt den geschachtelten Typ type bereit, der TrivialType und StandardLayoutType erfüllt und geeignet ist als nicht initialisierter Speicher für jedes Objekt, dessen Größe höchstens Len beträgt und dessen Ausrichtungsanforderung ein Teiler von Align ist.

Der Standardwert von Align ist die strengste (größte) Ausrichtungsanforderung für jedes Objekt, dessen Größe höchstens Len beträgt. Wenn der Standardwert nicht verwendet wird, muss Align dem Wert von alignof ( T ) für einen Typ T entsprechen, andernfalls ist das Verhalten undefiniert.

Das Verhalten ist undefiniert, wenn Len == 0 .

Es ist implementierungsdefiniert, ob eine erweiterte Ausrichtung unterstützt wird.

Wenn das Programm Spezialisierungen für std::aligned_storage hinzufügt, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Mitgliedertypen

Name Definition
type ein trivialer und standard-layout Typ mit mindestens der Größe Len und Ausrichtungsanforderung Align

Hilfstypen

template < std:: size_t Len, std:: size_t Align = /* Standardausrichtung */ >
using aligned_storage_t = typename aligned_storage < Len, Align > :: type ;
(seit C++14)
(veraltet in C++23)

Hinweise

Der von std::aligned_storage<>::type definierte Typ kann verwendet werden, um nicht initialisierte Speicherblöcke zu erstellen, die geeignet sind, Objekte eines gegebenen Typs aufzunehmen, optional mit einer strengeren Ausrichtung als ihre natürliche Ausrichtungsanforderung, beispielsweise an einer Cache- oder Seitenbegrenzung.

Wie bei jedem anderen nicht initialisierten Speicher werden die Objekte mit placement new erstellt und mit expliziten Destruktoraufrufen zerstört.

Mögliche Implementierung

Mit Ausnahme von Standardargumenten ist aligned_storage durch alignas ausdrückbar:

template<std::size_t Len, std::size_t Align = /* default alignment not implemented */>
struct aligned_storage
{
    struct type
    {
        alignas(Align) unsigned char data[Len];
    };
};

Beispiel

Eine primitive statische Vektor-Klasse, die die Erstellung, den Zugriff und die Zerstörung von Objekten in ausgerichteten Speicher demonstriert.

#include <cstddef>
#include <iostream>
#include <new>
#include <string>
#include <type_traits>
template<class T, std::size_t N>
class static_vector
{
    // Properly aligned uninitialized storage for N T's
    std::aligned_storage_t<sizeof(T), alignof(T)> data[N];
    std::size_t m_size = 0;
public:
    // Create an object in aligned storage
    template<typename ...Args> void emplace_back(Args&&... args)
    {
        if (m_size >= N) // Possible error handling
            throw std::bad_alloc{};
        // Construct value in memory of aligned storage using inplace operator new
        ::new(&data[m_size]) T(std::forward<Args>(args)...);
        ++m_size;
    }
    // Access an object in aligned storage
    const T& operator[](std::size_t pos) const
    {
        // Note: std::launder is needed after the change of object model in P0137R1
        return *std::launder(reinterpret_cast<const T*>(&data[pos]));
    }
    // Destroy objects from aligned storage
    ~static_vector()
    {
        for (std::size_t pos = 0; pos < m_size; ++pos)
            // Note: std::launder is needed after the change of object model in P0137R1
            std::destroy_at(std::launder(reinterpret_cast<T*>(&data[pos])));
    }
};
int main()
{
    static_vector<std::string, 10> v1;
    v1.emplace_back(5, '*');
    v1.emplace_back(10, '*');
    std::cout << v1[0] << '\n' << v1[1] << '\n';
}

Ausgabe:

*****
**********

Siehe auch

alignas (C++11) gibt an, dass der Speicher für die Variable auf eine bestimmte Größe ausgerichtet werden soll
(Spezifizierer)
ermittelt die Ausrichtungsanforderungen des Typs
(Klassentemplate)
alloziert ausgerichteten Speicher
(Funktion)
(seit C++11) (veraltet in C++23)
definiert den Typ, der als nicht initialisierter Speicher für alle gegebenen Typen geeignet ist
(Klassentemplate)
trivialer Typ mit Ausrichtungsanforderung so groß wie jeder andere skalare Typ
(Typdefinition)
(C++17)
Pointer-Optimierungsbarriere
(Funktionstemplate)