命名空间
变体
操作

std::aligned_storage

来自 cppreference.com
< cpp‎ | types
 
 
元编程库
类型特征
类型类别
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)
(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++17)

(C++11)(直到 C++20*)(C++17)
编译时有理数算术
编译时整数序列
 
定义在头文件 <type_traits>
template< std::size_t Len, std::size_t Align = /* 默认对齐 */ >
struct aligned_storage;
(自 C++11 起)
(C++23 中已弃用)

提供嵌套类型 type,它满足 TrivialTypeStandardLayoutType,适用于用作任何大小不超过 Len 且对齐要求为 Align 的因子的对象的未初始化存储。

Align 的默认值为任何大小不超过 Len 的对象的严格(最大)对齐要求。如果未使用默认值,则 Align 必须为某个类型 Talignof(T) 值,否则行为未定义。

如果 Len == 0,则行为未定义。

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

如果程序为 std::aligned_storage 添加了特化,则行为未定义。

内容

[编辑] 成员类型

名称 定义
type 至少大小为 Len 且对齐要求为 Align平凡标准布局 类型

[编辑] 辅助类型

template< std::size_t Len, std::size_t Align = /* 默认对齐 */ >
using aligned_storage_t = typename aligned_storage<Len, Align>::type;
(自 C++14 起)
(C++23 中已弃用)

[编辑] 注意

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

与任何其他未初始化的存储一样,对象是使用 放置 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) 指定变量的存储应该按特定数量对齐[编辑]
获取类型的对齐要求
(类模板) [编辑]
分配对齐的内存
(函数) [编辑]
(C++11)(C++23 中已弃用)
定义适用于用作所有给定类型的未初始化存储的类型
(类模板) [编辑]
对齐要求与任何其他标量类型一样大的平凡类型
(typedef) [编辑]
(C++17)
指针优化屏障
(函数模板) [编辑]