Skip to content

Latest commit

 

History

History
133 lines (103 loc) · 6.81 KB

allocator.md

File metadata and controls

133 lines (103 loc) · 6.81 KB

allocator

  • memory[meta header]
  • std[meta namespace]
  • class template[meta id-type]
namespace std {
  template <class T>
  class allocator;

  template <>
  class allocator<void> { // C++17から非推奨・C++20で削除
    using pointer       = void*;
    using const_pointer = const void*;
    using value_type    = void;
    template <class U> struct rebind { using other = allocator<U>; };
  };
}

概要

allocatorは、標準ライブラリ内でデフォルト使用されるメモリアロケータクラスである。

標準ライブラリ内では、主にコンテナがメモリの確保と解放を行っているが、コンテナ内で使用するメモリアロケータは、ユーザーが独自に実装したものをallocatorクラスの代わりに使用することもできる。例:

std::vector<int> v1;                   // std::allocatorクラスでメモリアロケートされる。
std::vector<int, MyAllocator<int>> v2; // 自分が用意したアロケータを使用する。

備考

C++11から:

デストラクタを除く、allocatorクラスのメンバ関数は、データ競合を引き起こさない。そのため、複数スレッドから同時にallocatorクラスのメンバ関数が呼ばれたとしても、正しくメモリ確保・解放される。

メンバ関数

名前 説明 対応バージョン
(constructor) コンストラクタ
(destructor) デストラクタ
operator=(const allocator&) = default 代入演算子
allocate メモリを確保する
deallocate メモリを解放する
address 変数のアドレスを取得する C++17から非推奨
C++20で削除
max_size 一度に確保可能なメモリの最大サイズを取得する C++17から非推奨
C++20で削除
construct 引数を元にインスタンスを構築する C++17から非推奨
C++20で削除
destroy インスタンスを破棄する C++17から非推奨
C++20で削除

メンバ型

名前 説明 対応バージョン
value_type 要素の型 T
propagate_on_container_move_assignment コンテナのムーブ代入時に、アロケータの状態を伝搬するか。 true_type C++14
size_type 要素数を表す符号なし整数型 size_t C++17から非推奨
C++20で削除
difference_type ポインタの差を表す符号付き整数型 ptrdiff_t C++17から非推奨
C++20で削除
pointer 要素のポインタ型 T* C++17から非推奨
C++20で削除
const_pointer 読み取り専用の要素のポインタ型 const T* C++17から非推奨
C++20で削除
reference 要素の参照型 T& C++17から非推奨
C++20で削除
const_reference 読み取り専用の要素の参照型 const T& C++17から非推奨
C++20で削除
rebind<U> Uを確保するように再束縛する C++17から非推奨
C++20で削除
is_always_equal 同じ型のアロケータオブジェクトが2つある場合、それらが常に同値であるか。true_type C++17

非メンバ関数

名前 説明 対応バージョン
operator== 等値比較。常にtrueを返す
operator!= 非等値比較。常にfalseを返す

非推奨・削除の詳細

C++17からvoidの特殊化版が非推奨となり、C++20で削除された。代わりにstd::allocator_traitsクラスのrebind機能を使用すること。

#include <memory>
#include <iostream>
#include <algorithm>
#include <numeric>

int main(int argc, char** argv) {
  auto alc = std::allocator<int>();

  // 10要素のint型が入る領域を確保
  int* arr = alc.allocate(10);

  // 確保した領域の各要素を構築する(コンストラクタを呼び出す)
  for (std::size_t i = 0; i != 10; ++i) alc.construct(arr + i);

  std::iota(arr, arr + 10, 0);
  std::for_each(arr, arr + 10, [](int i) { std::cout << i << " "; });
  std::cout << std::endl;

  // 配列の各要素を破棄する(デストラクタを呼び出す)
  for (std::size_t i = 0; i != 10; ++i) alc.destroy(arr + i);

  // 領域を解放する
  alc.deallocate(arr, 10);
}
  • std::allocator[color ff0000]
  • alc.allocate[link allocator/allocate.md]
  • alc.construct[link allocator/construct.md]
  • std::iota[link /reference/numeric/iota.md]
  • alc.destroy[link allocator/destroy.md]
  • alc.deallocate[link allocator/deallocate.md]

出力

0 1 2 3 4 5 6 7 8 9 

処理系

参照