命名空间
变体
操作

std::aligned_storage

来自 cppreference.cn
< cpp‎ | types
 
 
元编程库
类型特性
类型类别
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)(在 C++26 中弃用)
(C++11)(直到 C++20*)
(C++11)(在 C++20 中弃用)
(C++11)
类型特性常量
元函数
(C++17)
支持的操作
关系和属性查询
类型修改
(C++11)(C++11)(C++11)
类型转换
aligned_storage
(C++11)(在 C++23 中弃用)
(C++11)(在 C++23 中弃用)
(C++11)
(C++11)(直到 C++20*)(C++17)

(C++11)
(C++17)
编译时有理算术
编译时整数序列
 
定义于头文件 <type_traits>
template< std::size_t Len, std::size_t Align = /* default-alignment */ >
struct aligned_storage;
(since C++11)
(在 C++23 中弃用)

提供嵌套类型 type,它满足 TrivialTypeStandardLayoutType,且适合用作未初始化存储,用于任何尺寸至多为 Len对齐要求Align 的除数的对象。

Align 的默认值是对于任何尺寸至多为 Len 的对象的最严格(最大)对齐要求。若不使用默认值,则 Align 必须是某些类型 Talignof(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)[编辑]
获得类型的对齐要求
(class template) [编辑]
分配对齐内存
(function) [编辑]
(since C++11)(在 C++23 中弃用)
定义适合用作所有给定类型的未初始化存储的类型
(class template) [编辑]
平凡类型,其对齐要求与任何其他标量类型一样大
(typedef) [编辑]
(C++17)
指针优化屏障
(function template) [编辑]