Namespaces
Variants

std:: aligned_storage

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
aligned_storage
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
定義ヘッダ <type_traits>
template < std:: size_t Len, std:: size_t Align = /* default-alignment */ >
struct aligned_storage ;
(C++11以降)
(C++23で非推奨)

ネストされた型 type を提供します。この型は TrivialType および StandardLayoutType を満たし、サイズが最大 Len アライメント要件 Align の約数である任意のオブジェクトの未初期化ストレージとして使用するのに適しています。

Align のデフォルト値は、サイズが Len 以下のオブジェクトの中で最も厳格な(最大の)アライメント要件です。デフォルト値を使用しない場合、 Align は何らかの型 T に対する alignof ( T ) の値でなければならず、そうでない場合の動作は未定義です。

Len == 0 の場合、動作は未定義です。

いずれかの extended alignment がサポートされるかどうかは実装定義です。

プログラムが 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 ;
(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) 変数のストレージが特定の量でアライメントされることを指定する
(指定子)
型のアライメント要件を取得する
(クラステンプレート)
アライメントされたメモリを割り当てる
(関数)
(C++11) (C++23で非推奨)
すべての与えられた型の未初期化ストレージとして使用するのに適した型を定義する
(クラステンプレート)
他の任意のスカラ型と同じくらい大きなアライメント要件を持つトリビアル型
(typedef)
(C++17)
ポインタ最適化バリア
(関数テンプレート)