std::aligned_storage
来自 cppreference.cn
定义于头文件 <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
添加特化,则行为未定义。
目录 |
[编辑] 成员类型
名称 | 定义 |
类型
|
一个 平凡 且 标准布局 的类型,其大小至少为 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
定义的类型可用于创建未初始化的内存块,适合容纳给定类型的对象,可选择比其自然对齐要求更严格地对齐,例如在缓存或页面边界上。
与任何其他未初始化存储一样,对象使用 placement 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) |
微不足道的类型,其对齐要求与其他任何标量类型一样大 (类型定义) |
(C++17) |
指针优化屏障 (函数模板) |