C++1z 未初期化メモリのアルゴリズムと、デストラクタ呼び出しの関数

C++標準ライブラリには、データ構造を実装する際に使用する未初期化メモリに対するアルゴリズム<memory>ヘッダで定義されています。

C++1zでは、厳しいパフォーマンス要求があるデータ構造を実装しやすくするためのアルゴリズムが、いくつか定義されます。これらは、std::vectorの内部実装や、EASTL、follyといったライブラリの実装で使われていたものです。

関数 説明
std::destroy_at()
std::destroy()
std::destroy_n()
指定された単一要素もしくは範囲の要素に対してデストラクタを呼び出す
(配置newした要素に対してよく使う)
std::uninitialized_move()
std::uninitialized_move_n()
未初期化メモリから要素をムーブ構築する
std::uninitialized_value_construct()
std::uninitialized_value_construct_n()
未初期化メモリから要素を値初期化で構築する
std::uninitialized_default_construct()
std::uninitialized_default_construct()
未初期化メモリから要素をデフォルト構築する

宣言

// <memory>
namespace std {
  template <class T>
  void destroy_at(T* location);

  template <class ExecutionPolicy, class ForwardIterator>
  void destroy(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
               ForwardIterator first, ForwardIterator last);

  template <class ForwardIterator>
  void destroy(ForwardIterator first, ForwardIterator last);

  template <class ExecutionPolicy, class ForwardIterator, class Size>
  ForwardIterator destroy_n(ExecutionPolicy&& exec,//see [algorithms.parallel.overloads]
                            ForwardIterator first, Size n);

  template <class ForwardIterator, class Size>
  ForwardIterator destroy_n(ForwardIterator first, Size n);

  template <class ExecutionPolicy, class InputIterator, class ForwardIterator>
  ForwardIterator uninitialized_move(ExecutionPolicy&& exec,//see [algorithms.parallel.overloads]
                                     InputIterator first, InputIterator last, ForwardIterator result);

  template <class InputIterator, class ForwardIterator>
  ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result);

  template <class ExecutionPolicy, class InputIterator, class Size, class ForwardIterator>
  pair<InputIterator,ForwardIterator> uninitialized_move_n(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                      InputIterator first, Size n, ForwardIterator result);

  template <class InputIterator, class Size, class ForwardIterator>
  pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result);

  template <class ExecutionPolicy, class ForwardIterator>
  void uninitialized_value_construct(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                     ForwardIterator first, ForwardIterator last);
  template <class ForwardIterator>
  void uninitialized_value_construct(ForwardIterator first, ForwardIterator last);

  template <class ExecutionPolicy, class ForwardIterator, class Size>
  ForwardIterator uninitialized_value_construct_n(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                                  ForwardIterator first, Size n);

  template <class ForwardIterator, class Size>
  ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n);

  template <class ExecutionPolicy, class ForwardIterator>
  void uninitialized_default_construct(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                       ForwardIterator first, ForwardIterator last);

  template <class ForwardIterator>
  void uninitialized_default_construct(ForwardIterator first, ForwardIterator last);

  template <class ExecutionPolicy, class ForwardIterator, class Size>
  ForwardIterator uninitialized_default_construct_n(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                                   ForwardIterator first, Size n);

  template <class ForwardIterator, class Size>
  ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n);
}

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。