std::aligned_storage

定义于头文件 <type_traits>
template< std::size_t Len, std::size_t Align = /*default-alignment*/ >
struct aligned_storage;
(C++11 起)

提供嵌套类型 type ,其为平凡类型,适于作为任何大小至多为 Len对齐要求Align 的因数的对象的未初始化存储。

Align 的默认值是任何大小至多为 Len 的对象的最强(最大)对齐要求。若不使用默认值,则 Align 对于某类型 T 必须为 alignof(T) 的值,否则行为未定义。

Len == 0 则行为未定义。

是否支持任何扩展对齐是实现定义的。

目录

成员类型

名称 定义
type 长度至少为 Len 的 POD 类型,带对齐要求 Align

辅助类型

template< std::size_t Len, std::size_t Align = /*default-alignment*/ >
using aligned_storage_t = typename aligned_storage<Len, Align>::type;
(C++14 起)

注意

std::aligned_storage<>::type 所定义的类型能用于创建适合保有给定类型对象的未初始化内存块,可选地对齐严格于其自然对齐要求,例如在缓存或页边界上。

同任何其他未初始化存储,对象通过使用布置 new 创建,并以显式的析构函数调用销毁。

可能的实现

除了默认实参, aligned_storage 能通过 alignas 表达:

template<std::size_t Len, std::size_t Align /* 未实现默认对齐 */>
struct aligned_storage {
    struct type {
        alignas(Align) unsigned char data[Len];
    };
};

示例

原始的静态 vector 类,演示于对齐存储中创建、访问及析构对象

#include <iostream>
#include <type_traits>
#include <string>
 
template<class T, std::size_t N>
class static_vector
{
    // N 个 T 的正确对齐的未初始化存储
    typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N];
    std::size_t m_size = 0;
 
public:
    // 于对齐存储创建对象
    template<typename ...Args> void emplace_back(Args&&... args) 
    {
        if( m_size >= N ) // 可行的错误处理
            throw std::bad_alloc{};
        new(data+m_size) T(std::forward<Args>(args)...);
        ++m_size;
    }
 
    // 访问对齐存储中的对象
    const T& operator[](std::size_t pos) const 
    {
        return *reinterpret_cast<const T*>(data+pos);
    }
 
    // 从对齐存储删除对象
    ~static_vector() 
    {
        for(std::size_t pos = 0; pos < m_size; ++pos) {
            reinterpret_cast<T*>(data+pos)->~T();
        }
    }
};
 
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++11)
内存对齐需求不小于任何基本类型的平凡类型
(typedef)

版本历史

  • (当前 | 先前 2017年11月24日 (五) 18:30Fruderica讨论 | 贡献 . . (3,304字节) (+6). . (p0767r1 POD -> 平凡) (撤销)
  • 当前 | 先前 2017年11月6日 (一) 06:41Fruderica讨论 | 贡献 . . (3,298字节) (+71). . (撤销)
  • 当前 | 先前 2017年7月22日 (六) 19:50Fruderica讨论 | 贡献. . (3,227字节) (-567). . (撤销)
  • 当前 | 先前 2014年10月26日 (日) 18:11P12bot讨论 | 贡献 . . (3,794字节) (0). . (Fix some translations) (撤销)
  • 当前 | 先前 2013年7月2日 (二) 11:38P12bot讨论 | 贡献 . . (3,794字节) (-137). . (Use {{lc}}. Update links. Various fixes.) (撤销)
  • 当前 | 先前 2012年11月2日 (五) 17:29P12bot讨论 | 贡献 . . (3,931字节) (+265). . (r2.7.3) (机器人添加:de, en, es, fr, it, ja, pt, ru) (撤销)
  • 当前 | 先前 2012年10月27日 (六) 11:35P12讨论 | 贡献 . . (3,666字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 06:00TranslationBot讨论 | 贡献. . (3,666字节) (-64). . (Translated from the English version using Google Translate) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 03:33P12讨论 | 贡献 . . (3,730字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前) 2012年10月25日 (四) 12:00TranslationBot讨论 | 贡献. . (3,730字节) (+3,730). . (Translated from the English version using Google Translate)