命名空间
变体
操作

std::aligned_union

来自 cppreference.com
< cpp‎ | types
 
 
元编程库
类型特征
类型类别
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(直到 C++20*)
(C++11)(C++20 中已弃用)
(C++11)
类型特征常量
元函数
(C++17)
支持的操作
关系和属性查询
类型修改
(C++11)(C++11)(C++11)
类型转换
(C++11)(C++23 中已弃用)
aligned_union
(C++11)(C++23 中已弃用)
(C++11)
(C++11)
(C++17)

(C++11)(直到 C++20*)(C++17)
编译时有理数算术
编译时整数序列
 
定义在头文件 <type_traits>
template< std::size_t Len, class... Types >
struct aligned_union;
(自 C++11 起)
(C++23 中已弃用)

提供嵌套类型 type,它是一个 平凡 标准布局 类型,其大小和对齐方式适合用作 Types 中列出的任何类型的未初始化存储。存储的大小至少为 Lenstd::aligned_union 还确定所有 Types 中最严格(最大)的对齐要求,并将其作为常量 alignment_value 提供。

如果 sizeof...(Types) == 0Types 中的任何类型不是完整的对象类型,则行为未定义。

是否支持任何 扩展对齐 是实现定义的。

如果程序为 std::aligned_union 添加了特化,则行为未定义。

内容

[编辑] 成员类型

名称 定义
type 适合存储 Types 中任何类型的平凡且标准布局类型

[编辑] 辅助类型

template< std::size_t Len, class... Types >
using aligned_union_t = typename aligned_union<Len,Types...>::type;
(自 C++14 起)
(C++23 中已弃用)

[编辑] 成员常量

alignment_value
[静态]
所有 Types 中最严格的对齐要求
(公共静态成员常量)

[编辑] 可能的实现

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

[编辑] 示例

#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();
}

可能的输出

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

[编辑] 缺陷报告

以下行为更改的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR 应用于 发布的行为 正确的行为
LWG 2979 C++11 不需要完整类型 需要完整类型

[编辑] 另请参阅

获取类型的对齐要求
(类模板) [编辑]
(C++11)(C++23 中已弃用)
定义适合用作给定大小类型的未初始化存储的类型
(类模板) [编辑]