std::aligned_storage
来自cppreference.com
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <type_traits> 中定义
|
||
template< std::size_t Len, std::size_t Align = /*default-alignment*/ > struct aligned_storage; |
(C++11 起) | |
提供的的成员typedef
type
,这是一个POD类型,适合使用作为未初始化的存储的任何对象,其大小是至多Len
的对齐要求是Align
的除数。默认值Align
的任何对象,其大小是最Len
对齐要求是最严格的(最大).原文:
Provides the member typedef
type
, which is a POD type suitable for use as uninitialized storage for any object whose size is at most Len
and whose alignment requirement is a divisor of Align
. The default value of Align
is the most stringent (the largest) alignment requirement for any object whose size is at most Len
.目录 |
[编辑] 会员类型
姓名
|
Definition |
type
|
POD类型的大小
Len 的对齐要求Align 原文: the POD type of size Len with alignment requirement Align |
[编辑] 注释
由std::aligned_storage定义的类型可以用来创建适合保存的给定类型的对象的未初始化的内存块,任选对齐比必要严格,例如在一个高速缓存或页边界.
原文:
The type defined by std::aligned_storage can be used to create uninitialized memory blocks suitable to hold the objects of given type, optionally aligned stricter than necessary, for example on a cache or page boundary.
[编辑] 可能的实现
除了默认参数,aligned_storage是表达的alignas的
原文:
Except for default argument, aligned_storage is expressible in terms of alignas:
template<std::size_t Len, std::size_t Align> struct aligned_storage { typedef struct { alignas(Align) unsigned char data[Len]; } type; }; |
[编辑] 示例
一个原始的静态向量类,,展示创建,访问,和破坏的对象的对齐存储
原文:
A primitive static vector class, demonstrating creation, access, and destruction of objects in aligned storage
#include <iostream> #include <type_traits> #include <string> template<class T, std::size_t N> class static_vector { // propertly aligned uninitialized storage for N T's typename std::aligned_storage <sizeof(T), std::alignment_of<T>::value>::type data[N]; std::size_t m_size; public: static_vector() : m_size(0) {}; // Create an object in aligned storage template<typename ...Args> void emplace_back(Args&&... args) { new(data+m_size) T(std::forward<Args>(args)...); m_size++; // bounds check omitted } // Access an object in aligned storage const T& operator[](size_t pos) const { return reinterpret_cast<const T&>(data[pos]); } // Delete objects from aligned storage ~static_vector() { for(std::size_t pos = 0; pos < m_size; ++pos) { reinterpret_cast<const T*>(data+pos)->~T(); } } }; int main() { static_vector<std::string, 10> v1; v1.emplace_back(std::string(5, '*')); v1.emplace_back(std::string(10, '*')); std::cout << v1[0] << '\n' << v1[1] << '\n'; }
输出:
***** **********
[编辑] 另请参阅
alignas说明 | 指定的变量的存储空间应保持一致的具体数额(C++11)
原文: specifies that the storage for the variable should be aligned by specific amount (C++11) |
(C++11) |
获取类型的最小对齐字节数 (类模板) |
(C++11) |
定义所有给定类型在未初始化时需要的最大内存空间大小 (类模板) |
(C++11) |
内存对齐需求不小于任何基本类型的POD类型 (typedef) |