名前空間
変種
操作

std::aligned_storage

提供: cppreference.com
< cpp‎ | types

 
 
 
型サポート
型プロトタイプ
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(deprecated in C++17)
(C++11)(deprecated in C++20)
(C++11)
型特性定数
メタ関数
(C++17)
エンディアン
(C++20)
サポートされている操作
関係と性質の問い合わせ
(C++11)
(C++11)
(C++11)
(C++11)
型変更
(C++11)(C++11)(C++11)
型変換
aligned_storage
(C++11)
(C++11)
(C++11)
(C++17)
(C++11)(deprecated in C++17)(C++17)
 
ヘッダ <type_traits> で定義
template< std::size_t Len, std::size_t Align = /*default-alignment*/ >
struct aligned_storage;
(C++11およびそれ以降)
サイズは最もtypeとした、アラインメント要件Lenの除数である任意のオブジェクトの初期化されていないストレージとして使用するのに適したPOD型であるメンバのtypedefAlignは、用意されています。 Alignのデフォルト値は、ほとんどのサイズLenにある任意のオブジェクトの(最大)の最も厳しいアラインメント要件です.
Original:
Provides the member typedef type, which is a POD type suitable for use as uninitialized storage for any object whose size is at most Len and whose alignment requirement is a divisor of Align. The default value of Align is the most stringent (the largest) alignment requirement for any object whose size is at most Len.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

目次

[編集] メンバータイプ

名前
Original:
Name
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Definition
type
アライメント要件LenでサイズAlignのPOD型
Original:
the POD type of size Len with alignment requirement Align
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[編集] ノート

std::aligned_storageによって定義された型は、キャッシュやページ境界上例えば、必要に応じて、必要以上に厳格に整列、与えられた型のオブジェクトを保持するのに適した初期化されていないメモリブロックを作成するために使用することができます.
Original:
The type defined by std::aligned_storage can be used to create uninitialized memory blocks suitable to hold the objects of given type, optionally aligned stricter than necessary, for example on a cache or page boundary.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[編集] 可能な実装

デフォルトの引数を除き、aligned_storageはalignasの面で表現できる
Original:
Except for default argument, aligned_storage is expressible in terms of alignas:
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
template<std::size_t Len, std::size_t Align>
struct aligned_storage {
    typedef struct {
        alignas(Align) unsigned char data[Len];
    } type;
};

[編集]

プリミティブstatic vectorクラス、デモの作成、アクセス、および整列ストレージ内のオブジェクトの破壊
Original:
A primitive static vector class, demonstrating creation, access, and destruction of objects in aligned storage
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

#include <iostream>
#include <type_traits>
#include <string>
 
template<class T, std::size_t N>
class static_vector
{
    // propertly aligned uninitialized storage for N T's
    typename std::aligned_storage <sizeof(T), std::alignment_of<T>::value>::type data[N];
    std::size_t m_size;
public:
 
    static_vector() : m_size(0) {};
    // Create an object in aligned storage
    template<typename ...Args> void emplace_back(Args&&... args) 
    {
        new(data+m_size) T(std::forward<Args>(args)...);
        m_size++; // bounds check omitted
    }
 
    // Access an object in aligned storage
    const T& operator[](size_t pos) const 
    {
        return reinterpret_cast<const T&>(data[pos]);
    }
    // Delete objects from aligned storage
    ~static_vector() 
    {
        for(std::size_t pos = 0; pos < m_size; ++pos) {
            reinterpret_cast<const T*>(data+pos)->~T();
        }
    }
};
 
int main()
{
    static_vector<std::string, 10> v1;
    v1.emplace_back(std::string(5, '*'));
    v1.emplace_back(std::string(10, '*'));
    std::cout << v1[0] << '\n' << v1[1] << '\n';
}

出力:

*****
**********

[編集] 参照

alignas指定子
変数の記憶領域が特定の量(C++11)で整列されるように指定します
Original:
specifies that the storage for the variable should be aligned by specific amount (C++11)
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
[edit]
型のアライメント要件を取得します
(クラステンプレート) [edit]
指定された型すべてのための未初期化記憶域として使用するのに適した型を定義します
(クラステンプレート) [edit]
他のいかなるスカラー型より大きいまたは等しいアライメント要件を持つトリビアルな型
(typedef) [edit]