Namensräume
Varianten
Aktionen

std::aligned_union

Von cppreference.com
< cpp‎ | types
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
Beziehungen und Eigenschaftsabfragen
Typmodifikationen
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
aligned_union
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
Definiert in der Kopfdatei <type_traits>
template< std::size_t Len, class... Types >
struct aligned_union;
(seit C++11)
(veraltet in C++23)

Stellt den verschachtelten Typ type bereit, der ein trivialer Standardlayout-Typ ist, dessen Größe und Ausrichtung für die Verwendung als uninitialisierter Speicher für ein Objekt eines beliebigen der in Types aufgeführten Typen geeignet sind. Die Größe des Speichers ist mindestens Len. std::aligned_union ermittelt auch die strengste (größte) Ausrichtungsanforderung aller Types und stellt sie als Konstante alignment_value zur Verfügung.

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

Es ist implementierungsabhängig, ob eine erweiterte Ausrichtung unterstützt wird.

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

Inhalt

[bearbeiten] Member-Typen

Name Definition
type ein trivialer und Standardlayout-Typ, der für die Speicherung jedes Typs aus Types geeignet ist

[bearbeiten] 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)

[bearbeiten] Member-Konstanten

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

[bearbeiten] 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)...})];
    };
};

[bearbeiten] 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

[bearbeiten] 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 2979 C++11 vollständiger Typ war nicht erforderlich erfordert vollständige Typen

[bearbeiten] Siehe auch

erhält die Ausrichtungsvoraussetzungen des Typs
(Klassenvorlage) [bearbeiten]
(seit C++11)(veraltet in C++23)
definiert den Typ, der als uninitialisierter Speicher für Typen gegebener Größe geeignet ist
(Klassenvorlage) [bearbeiten]