std::aligned_union
来自 cppreference.com
定义在头文件 <type_traits> 中 |
||
template< std::size_t Len, class... Types > struct aligned_union; |
(自 C++11 起) (C++23 中已弃用) |
|
提供嵌套类型 type
,它是一个 平凡 标准布局 类型,其大小和对齐方式适合用作 Types
中列出的任何类型的未初始化存储。存储的大小至少为 Len
。std::aligned_union
还确定所有 Types
中最严格(最大)的对齐要求,并将其作为常量 alignment_value
提供。
如果 sizeof...(Types) == 0 或 Types
中的任何类型不是完整的对象类型,则行为未定义。
是否支持任何 扩展对齐 是实现定义的。
如果程序为 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++11)(C++23 中已弃用) |
定义适合用作给定大小类型的未初始化存储的类型 (类模板) |