最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::aligned_storage(C++11)

namespace std {
  template <std::size_t Len,
            std::size_t Align = default-alignment>
  struct aligned_storage {
    typedef  type;
  };

  template <std::size_t Len,
            std::size_t Align = default-alignment>
  using aligned_storage_t = typename aligned_storage<Len,Align>::type; // C++14
}

概要

アライメント調整された領域を作る。

要件

Lenが非ゼロであること。Alignは、得ようとしてる領域の要素型Tに対するalignof(T)と同じ大きさか、もしくはデフォルト値であること。

効果

aligned_storageは、領域サイズLen、アライメントAlignで調整した未初期化領域をメンバ型typeとして定義する。
メンバ型typeはPOD型となる(参照:is_pod)。

Alignのデフォルト値は、Lenよりも大きくない、最も厳格なアライメント要件を持つ、C++の何らかのオブジェクト型のアラインメント値。

#include <iostream>
#include <type_traits>

template <class T, std::size_t Capacity>
class StackContainer {
  // 長さ:sizeof(T) * Count、
  // アライメント:alignof(T)
  // でアライメント調整された領域を作る
  typename
    std::aligned_storage<sizeof(T) * Capacity, alignof(T)>::type
  storage;

  std::size_t size_ = 0;

  T* data()
  {
    return static_cast<T*>(static_cast<void*>(&storage));
  }

public:
  void push(T value)
  {
    // 未初期化領域に要素を作る
    new (data() + size_) T(value);
    ++size_;
  }

  T& front()
  {
    return *data();
  }

  ~StackContainer()
  {
    for (std::size_t i = 0; i < size_; ++i) {
      (data() + i)->~T();
    }
  }
};

int main()
{
  StackContainer<int, 3> cont;
  cont.push(1);

  std::cout << cont.front() << std::endl;
}

出力

1

バージョン

言語

  • C++11

処理系

  • Clang: 3.0
  • GCC, C++11 mode: 4.5.4
  • Visual C++: 9.0 (std::tr1), 10.0, 11.0, 12.0, 14.0
    • Visual C++ 10.0までは、Alignのデフォルト実引数が定義されていない。
    • Visual C++ 11.0からは、Alignのデフォルト実引数はstd::alignment_of<max_align_t>::valueと定義されている。
    • aligned_storage_tはVisual C++ 12.0から

参照