Namespaces
Variants

std:: aligned_union

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
(C++11) (deprecated in C++23)
aligned_union
(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, class ... Types >
struct aligned_union ;
(seit C++11)
(veraltet in C++23)

Stellt den geschachtelten Typ type bereit, welcher ein trivialer Standard-Layout -Typ mit einer Größe und Ausrichtung ist, die sich zur Verwendung als nicht initialisierter Speicher für ein Objekt eines beliebigen in Types aufgeführten Typs eignet. Die Größe des Speichers beträgt mindestens Len . std::aligned_union bestimmt ebenfalls die strengste (größte) Ausrichtungsanforderung unter allen Types und stellt sie als Konstante alignment_value zur Verfügung.

Wenn sizeof... ( Types ) == 0 oder wenn einer der Typen in Types kein vollständiger Objekttyp ist, ist das Verhalten undefiniert.

Es ist implementierungsdefiniert, ob eine extended alignment unterstützt wird.

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

Inhaltsverzeichnis

Mitgliedertypen

Name Definition
type ein trivialer und standard-layout Typ, geeignet zur Speicherung jedes Typs aus Types

Hilfstypen

template < std:: size_t Len, class ... Types >
using aligned_union_t = typename aligned_union < Len,Types... > :: type ;
(seit C++14)
(veraltet in C++23)

Member-Konstanten

alignment_value
[static]
die strengste Ausrichtungsanforderung aller Types
(öffentliche statische Member-Konstante)

Mögliche Implementierung

#include <algorithm>
template<std::size_t Len, class... Types>
struct aligned_union
{
    static constexpr std::size_t alignment_value = std::max({alignof(Types)...});
    struct type
    {
        alignas(alignment_value) char _s[std::max({Len, sizeof(Types)...})];
    };
};

Beispiel

#include <iostream>
#include <string>
#include <type_traits>
int main()
{
    std::cout << sizeof(std::aligned_union_t<0, char>) << ' ' // 1
              << sizeof(std::aligned_union_t<2, char>) << ' ' // 2
              << sizeof(std::aligned_union_t<2, char[3]>) << ' ' // 3 (!)
              << sizeof(std::aligned_union_t<3, char[4]>) << ' ' // 4
              << sizeof(std::aligned_union_t<1, char, int, double>) << ' '    // 8
              << sizeof(std::aligned_union_t<12, char, int, double>) << '\n'; // 16 (!)
    using var_t = std::aligned_union<16, int, std::string>;
    std::cout << "var_t::alignment_value = " << var_t::alignment_value << '\n'
              << "sizeof(var_t::type) = " << sizeof(var_t::type) << '\n';
    var_t::type aligned_storage;
    int* int_ptr = new(&aligned_storage) int(42); // placement new
    std::cout << "*int_ptr = " << *int_ptr << '\n';
    std::string* string_ptr = new(&aligned_storage) std::string("bar");
    std::cout << "*string_ptr = " << *string_ptr << '\n';
    *string_ptr = "baz";
    std::cout << "*string_ptr = " << *string_ptr << '\n';
    string_ptr->~basic_string();
}

Mögliche Ausgabe:

1 2 3 4 8 16
var_t::alignment_value = 8
sizeof(var_t::type) = 32
*int_ptr = 42
*string_ptr = bar
*string_ptr = baz

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2979 C++11 vollständiger Typ war nicht erforderlich erfordert vollständige Typen

Siehe auch

ermittelt die Ausrichtungsanforderungen eines Typs
(Klassentemplate)
(since C++11) (deprecated in C++23)
definiert den Typ, der als nicht initialisierter Speicher für Typen gegebener Größe verwendet werden kann
(Klassentemplate)