Поделиться через


Класс aligned_union

Предоставляет достаточно большой и должным образом выровненный тип POD для хранения типа объединения и требуемого размера.

Синтаксис

template <std::size_t Len, class... Types>
struct aligned_union;

template <std::size_t Len, class... Types>
using aligned_union_t = typename aligned_union<Len, Types...>::type;

Параметры

Len
Значение выравнивания для самого крупного типа в объединении.

Типы
Различные типы в базовом объединении.

Замечания

Используйте шаблон класса, чтобы получить выравнивание и размер, необходимые для хранения объединения в неинициализированном хранилище. Типdef type элемента называет тип POD, подходящий для хранения любого типа, указанного в типах; минимальный размер — Len. Статический элемент alignment_value типа std::size_t содержит строгое выравнивание, необходимое для всех типов, перечисленных в типах.

Пример

В следующем примере показано, как использовать aligned_union для выделения буфера выровненного стека для размещения объединения.

// std__type_traits__aligned_union.cpp
#include <iostream>
#include <type_traits>

union U_type
{
    int i;
    float f;
    double d;
    U_type(float e) : f(e) {}
};

typedef std::aligned_union<16, int, float, double>::type aligned_U_type;

int main()
{
    // allocate memory for a U_type aligned on a 16-byte boundary
    aligned_U_type au;
    // do placement new in the aligned memory on the stack
    U_type* u = new (&au) U_type(1.0f);
    if (nullptr != u)
    {
        std::cout << "value of u->i is " << u->i << std::endl;
        // must clean up placement objects manually!
        u->~U_type();
    }
}
value of u->i is 1065353216

Требования

Заголовок:<type_traits>

Пространство имен: std

См. также

<type_traits>
Класс alignment_of