std:: aligned_storage
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定義ヘッダ
<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++17)
|
アライメントされたメモリを割り当てる
(関数) |
|
(C++11)
(C++23で非推奨)
|
すべての与えられた型の未初期化ストレージとして使用するのに適した型を定義する
(クラステンプレート) |
|
(C++11)
|
他の任意のスカラ型と同じくらい大きなアライメント要件を持つトリビアル型
(typedef) |
|
(C++17)
|
ポインタ最適化バリア
(関数テンプレート) |