std::aligned_storage
来自 cppreference.com
定义在头文件 <type_traits> 中 |
||
template< std::size_t Len, std::size_t Align = /* 默认对齐 */ > struct aligned_storage; |
(自 C++11 起) (C++23 中已弃用) |
|
提供嵌套类型 type
,它满足 TrivialType 和 StandardLayoutType,适用于用作任何大小不超过 Len
且对齐要求为 Align
的因子的对象的未初始化存储。
Align
的默认值为任何大小不超过 Len
的对象的严格(最大)对齐要求。如果未使用默认值,则 Align
必须为某个类型 T
的 alignof(T) 值,否则行为未定义。
如果 Len == 0,则行为未定义。
是否支持任何 扩展对齐 是实现定义的。
如果程序为 std::aligned_storage
添加了特化,则行为未定义。
内容 |
[编辑] 成员类型
名称 | 定义 |
type
|
至少大小为 Len 且对齐要求为 Align 的 平凡 且 标准布局 类型 |
[编辑] 辅助类型
template< std::size_t Len, std::size_t Align = /* 默认对齐 */ > using aligned_storage_t = typename aligned_storage<Len, Align>::type; |
(自 C++14 起) (C++23 中已弃用) |
|
[编辑] 注意
由 std::aligned_storage<>::type
定义的类型可用于创建未初始化的内存块,这些内存块适合保存给定类型的对象,可选地比它们的自然对齐要求更严格,例如在缓存或页面边界上。
与任何其他未初始化的存储一样,对象是使用 放置 new 创建,并使用显式析构函数调用销毁。
[编辑] 可能的实现
除了默认参数之外,aligned_storage 可以用 alignas 来表达
template<std::size_t Len, std::size_t Align = /* default alignment not implemented */> struct aligned_storage { struct type { alignas(Align) unsigned char data[Len]; }; }; |
[编辑] 示例
一个原始的静态向量类,演示了在对齐存储中创建、访问和销毁对象。
运行此代码
#include <cstddef> #include <iostream> #include <new> #include <string> #include <type_traits> template<class T, std::size_t N> class static_vector { // Properly aligned uninitialized storage for N T's std::aligned_storage_t<sizeof(T), alignof(T)> data[N]; std::size_t m_size = 0; public: // Create an object in aligned storage template<typename ...Args> void emplace_back(Args&&... args) { if (m_size >= N) // Possible error handling throw std::bad_alloc{}; // Construct value in memory of aligned storage using inplace operator new ::new(&data[m_size]) T(std::forward<Args>(args)...); ++m_size; } // Access an object in aligned storage const T& operator[](std::size_t pos) const { // Note: std::launder is needed after the change of object model in P0137R1 return *std::launder(reinterpret_cast<const T*>(&data[pos])); } // Destroy objects from aligned storage ~static_vector() { for (std::size_t pos = 0; pos < m_size; ++pos) // Note: std::launder is needed after the change of object model in P0137R1 std::destroy_at(std::launder(reinterpret_cast<T*>(&data[pos]))); } }; int main() { static_vector<std::string, 10> v1; v1.emplace_back(5, '*'); v1.emplace_back(10, '*'); std::cout << v1[0] << '\n' << v1[1] << '\n'; }
输出
***** **********
[编辑] 另请参阅
alignas 说明符(C++11) |
指定变量的存储应该按特定数量对齐 |
(C++11) |
获取类型的对齐要求 (类模板) |
(C++17) |
分配对齐的内存 (函数) |
(C++11)(C++23 中已弃用) |
定义适用于用作所有给定类型的未初始化存储的类型 (类模板) |
(C++11) |
对齐要求与任何其他标量类型一样大的平凡类型 (typedef) |
(C++17) |
指针优化屏障 (函数模板) |