std::aligned_storage
来自 cppreference.cn
定义于头文件 <type_traits> |
||
template< std::size_t Len, std::size_t Align = /* default-alignment */ > struct aligned_storage; |
(since C++11) (在 C++23 中弃用) |
|
提供嵌套类型 type
,它满足 TrivialType 和 StandardLayoutType,且适合用作未初始化存储,用于任何尺寸至多为 Len
且对齐要求是 Align
的除数的对象。
Align
的默认值是对于任何尺寸至多为 Len
的对象的最严格(最大)对齐要求。若不使用默认值,则 Align
必须是某些类型 T
的 alignof(T) 的值,否则行为未定义。
若 Len == 0,则行为未定义。
是否支持任何扩展对齐是实现定义的。
若程序为 std::aligned_storage
添加特化,则行为未定义。
内容 |
[编辑] 成员类型
名称 | 定义 |
type
|
至少尺寸为 Len 且对齐要求为 Align 的平凡 (trivial)且标准布局 (standard-layout)类型 |
[编辑] 辅助类型
template< std::size_t Len, std::size_t Align = /* default-alignment */ > using aligned_storage_t = typename aligned_storage<Len, Align>::type; |
(since 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) |
指定变量的存储应按特定量对齐 (specifier) |
(C++11) |
获得类型的对齐要求 (class template) |
(C++17) |
分配对齐内存 (function) |
(since C++11)(在 C++23 中弃用) |
定义适合用作所有给定类型的未初始化存储的类型 (class template) |
(C++11) |
平凡类型,其对齐要求与任何其他标量类型一样大 (typedef) |
(C++17) |
指针优化屏障 (function template) |