名前空間
変種
操作

std::scoped_allocator_adaptor

提供: cppreference.com
< cpp‎ | memory
 
 
動的メモリ管理
スマートポインタ
(C++11)
(C++11)
(C++11)
(C++17以前)
(C++11)
アロケータ
scoped_allocator_adaptor
(C++11)
メモリリソース
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
C のライブラリ
低水準のメモリ管理
 
 
ヘッダ <scoped_allocator> で定義
template< class OuterAlloc, class... InnerAlloc >
class scoped_allocator_adaptor : public OuterAlloc;
(C++11およびそれ以降)

std::scoped_allocator_adaptor クラステンプレートは多段コンテナ (マップのタプルのリストのセットのベクタ、など) で使用できるアロケータです。 1個の外側のアロケータ型 OuterAlloc および0個以上の内側のアロケータ型 InnerAlloc... を用いて実体化されます。 scoped_allocator_adaptor を用いて直接構築されたコンテナは要素を確保するために OuterAlloc を使用しますが、要素は、それ自身がコンテナであれば、最初の内側のアロケータを使用します。 そのコンテナの要素は、それ自身がコンテナであれば、2番目の内側のアロケータを使用します。 以下同様です。 内側のアロケータより多くの段数のコンテナが存在する場合、以降のすべてのネストしたコンテナは最後の内側のアロケータを再使用します。

このアダプタの目的は、ネストしたコンテナのすべての段が同じ共有メモリセグメントに配置しなければならないときなどに、ネストしたコンテナのステートフルなアロケータを正しく初期化することです。 アダプタのコンストラクタはリスト内のすべてのアロケータに対する引数を取り、ネストしたコンテナはそれぞれ必要に応じてアダプタからアロケータの状態を取得します。

scoped_allocator_adaptor の目的において、次の内側のアロケータが A の場合、 std::uses_allocator<T,A>::value == true である任意のクラス T はそれがコンテナであるかのように再帰に参加します。 さらに、 scoped_allocator_adaptor::construct の特定のオーバーロードによって、 std::pair はそのようなコンテナとして扱われます。

一般的な実装はメンバオブジェクトとして std::scoped_allocator_adaptor<InnerAllocs...> のインスタンスを保持します。

目次

[編集] メンバ型

定義
outer_allocator_type OuterAlloc
inner_allocator_type scoped_allocator_adaptor<InnerAllocs...>、または sizeof...(InnerAllocs) == 0 の場合は scoped_allocator_adaptor<OuterAlloc>
value_type std::allocator_traits<OuterAlloc>::value_type
size_type std::allocator_traits<OuterAlloc>::size_type
difference_type std::allocator_traits<OuterAlloc>::difference_type
pointer std::allocator_traits<OuterAlloc>::pointer
const_pointer std::allocator_traits<OuterAlloc>::const_pointer
void_pointer std::allocator_traits<OuterAlloc>::void_pointer
const_void_pointer std::allocator_traits<OuterAlloc>::const_void_pointer
propagate_on_container_copy_assignment
OuterAlloc および InnerAlloc... の少なくともひとつのアロケータ A について std::allocator_traits<A>::propagate_on_container_copy_assignment::valuetrue であれば std::true_type
propagate_on_container_move_assignment
OuterAlloc および InnerAlloc... の少なくともひとつのアロケータ A について std::allocator_traits<A>::propagate_on_container_move_assignment::valuetrue であれば std::true_type
propagate_on_container_swap
OuterAlloc および InnerAlloc... の少なくともひとつのアロケータ A について std::allocator_traits<A>::propagate_on_container_swap::valuetrue であれば std::true_type
is_always_equal(C++17)
OuterAlloc および InnerAlloc... のすべてのアロケータ A について std::allocator_traits<A>::is_always_equal::valuetrue であれば std::true_type
rebind
template< class T >
struct rebind {
    typedef scoped_allocator_adaptor<
        std::allocator_traits<OuterAlloc>::template rebind_alloc<T>, 
        InnerAllocs...
    > other;
};

[編集] メンバ関数

新しい scoped_allocator_adaptor のインスタンスを作成します
(パブリックメンバ関数) [edit]
scoped_allocator_adaptor のインスタンスを破棄します
(パブリックメンバ関数) [edit]
scoped_allocator_adaptor を代入します
(パブリックメンバ関数) [edit]
inner_allocator の参照を取得します
(パブリックメンバ関数) [edit]
outer_allocator の参照を取得します
(パブリックメンバ関数) [edit]
外側のアロケータを使用して未初期化記憶域を確保します
(パブリックメンバ関数) [edit]
外側のアロケータを使用して記憶域を解放します
(パブリックメンバ関数) [edit]
外側のアロケータによってサポートされる最大確保サイズを返します
(パブリックメンバ関数) [edit]
適切であればコンストラクタに内側のアロケータを渡して、確保された記憶域内にオブジェクトを構築します
(パブリックメンバ関数) [edit]
確保された記憶域内のオブジェクトを破棄します
(パブリックメンバ関数) [edit]
scoped_allocator_adaptor およびそのすべてのアロケータの状態をコピーします
(パブリックメンバ関数) [edit]

[編集] 非メンバ関数

2つの scoped_allocator_adaptor のインスタンスを比較します
(パブリックメンバ関数) [edit]

[編集] 推定ガイド(C++17およびそれ以降)

[編集]

#include <vector>
#include <scoped_allocator>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/adaptive_pool.hpp>
namespace bi = boost::interprocess;
template<class T> using alloc = bi::adaptive_pool<T,
                                    bi::managed_shared_memory::segment_manager>;
using ipc_row = std::vector<int, alloc<int>>;
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;
int main ()
{
   bi::managed_shared_memory s(bi::create_only, "Demo", 65536);
 
   // create vector of vectors in shared memory
   ipc_matrix v(s.get_segment_manager());
 
   // for all these additions, the inner vectors obtain their allocator arguments
   // from the outer vector's scoped_allocator_adaptor
   v.resize(1); v[0].push_back(1);
   v.emplace_back(2);
   std::vector<int> local_row = {1,2,3};
   v.emplace_back(local_row.begin(), local_row.end());
 
   bi::shared_memory_object::remove("Demo");
}


[編集] 関連項目

アロケータ型に関する情報を提供します
(クラステンプレート) [edit]
指定された型が uses-allocator 構築をサポートしているかどうか調べます
(クラステンプレート) [edit]
デフォルトのアロケータ
(クラステンプレート) [edit]