std::aligned_storage
来自cppreference.com
|
|
该页由英文版维基使用谷歌翻译机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击此处。 |
<metanoindex/>
| 在标头 <type_traits> 定义
|
||
| |
(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
|
。注释。
。由
std::aligned_storage定义的类型可以用来创建适合保存的给定类型的对象的未初始化的内存块,任选对齐比必要严格,例如在一个高速缓存或页边界.。可能的实现。
。除了默认参数,aligned_storage是表达的alignas的。
template<std::size_t Len, std::size_t Align>
struct aligned_storage {
typedef struct {
alignas(Align) unsigned char data[Len];
} type;
};
|
。为例。
。一个原始的静态向量类,,展示创建,访问,和破坏的对象的对齐存储。
运行此代码
#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';
}
输出:
*****
**********