Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::scoped_allocator_adaptor

      From cppreference.com
      <cpp‎ |memory
       
       
      Memory management library
      (exposition only*)
      Allocators
      scoped_allocator_adaptor
      (C++11)
      Uninitialized memory algorithms
      Constrained uninitialized memory algorithms
      Memory resources
      Uninitialized storage(until C++20)
      (until C++20*)
      (until C++20*)
      Garbage collector support(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
       
       
      Defined in header<scoped_allocator>
      template<class OuterAlloc,class...InnerAllocs>

      class scoped_allocator_adaptor

         :public OuterAlloc;
      (since C++11)

      Thestd::scoped_allocator_adaptor class template is an allocator which can be used with multilevel containers (vector of sets of lists of tuples of maps, etc). It is instantiated with one outer allocator typeOuterAlloc and zero or more inner allocator typesInnerAlloc.... A container constructed directly with ascoped_allocator_adaptor usesOuterAlloc to allocate its elements, but if an element is itself a container, it uses the first inner allocator. The elements of that container, if they are themselves containers, use the second inner allocator, etc. If there are more levels to the container than there are inner allocators, the last inner allocator is reused for all further nested containers.

      The purpose of this adaptor is to correctly initialize stateful allocators in nested containers, such as when all levels of a nested container must be placed in the same shared memory segment. The adaptor's constructor takes the arguments for all allocators in the list, and each nested container obtains its allocator's state from the adaptor as needed.

      For the purpose ofscoped_allocator_adaptor, if the next inner allocator isA, any classT for whichstd::uses_allocator<T,A>::value==true participates in the recursion as if it was a container. Additionally,std::pair is treated as such a container by specific overloads ofscoped_allocator_adaptor::construct.

      Typical implementation holds an instance of astd::scoped_allocator_adaptor<InnerAllocs...> as a member object.

      Note thatstd::pmr::polymorphic_allocators propagate to nested containers followinguses-allocator construction and do not need (and do not work with)std::scoped_allocator_adaptor.

      Contents

      [edit]Nested types

      Type Definition
      outer_allocator_typeOuterAlloc
      inner_allocator_type
      • scoped_allocator_adaptor<OuterAlloc> ifsizeof...(InnerAllocs) is zero
      • scoped_allocator_adaptor<InnerAllocs...> otherwise
      value_typestd::allocator_traits<OuterAlloc>::value_type
      size_typestd::allocator_traits<OuterAlloc>::size_type
      difference_typestd::allocator_traits<OuterAlloc>::difference_type
      pointerstd::allocator_traits<OuterAlloc>::pointer
      const_pointerstd::allocator_traits<OuterAlloc>::const_pointer
      void_pointerstd::allocator_traits<OuterAlloc>::void_pointer
      const_void_pointerstd::allocator_traits<OuterAlloc>::const_void_pointer


      Given the set ofOuterAlloc andInnerAlloc... asAllocs:

      Type Definition
      propagate_on_container_copy_assignment
      propagate_on_container_move_assignment
      propagate_on_container_swap
      is_always_equal

      [edit]Member functions

      creates a newscoped_allocator_adaptor object
      (public member function)[edit]
      destructs ascoped_allocator_adaptor object
      (public member function)[edit]
      assigns ascoped_allocator_adaptor
      (public member function)[edit]
      obtains aninner_allocator reference
      (public member function)[edit]
      obtains anouter_allocator reference
      (public member function)[edit]
      allocates uninitialized storage using the outer allocator
      (public member function)[edit]
      deallocates storage using the outer allocator
      (public member function)[edit]
      returns the largest allocation size supported by the outer allocator
      (public member function)[edit]
      constructs an object in allocated storage, passing the inner allocator to its constructor if appropriate
      (public member function)[edit]
      destructs an object in allocated storage
      (public member function)[edit]
      copies the state ofscoped_allocator_adaptor and all its allocators
      (public member function)[edit]
      Exposition-only function templates
      obtains the outermost allocator
      (exposition-only member function*)
      constructs an object using the outermost allocator
      (exposition-only member function*)
      destroys an object using the outermost allocator
      (exposition-only member function*)

      [edit]Non-member functions

      (removed in C++20)
      compares twoscoped_allocator_adaptor objects
      (function template)[edit]

      [edit]Deduction guides(since C++17)

      [edit]Nested classes

      Class Definition
      rebind template<class T>

      struct rebind
      {
         using other= scoped_allocator_adaptor
                           <std::allocator_traits<OuterAlloc>::template rebind_alloc<T>,
                             InnerAllocs...>;
      };

      [edit]Example

      Run this code
      #include <boost/interprocess/allocators/adaptive_pool.hpp>#include <boost/interprocess/managed_shared_memory.hpp>#include <scoped_allocator>#include <vector> 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]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 2108C++11there was no way to show ifscoped_allocator_adaptor is statelessprovidedis_always_equal

      [edit]See also

      provides information about allocator types
      (class template)[edit]
      checks if the specified type supports uses-allocator construction
      (class template)[edit]
      the default allocator
      (class template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/memory/scoped_allocator_adaptor&oldid=179773"

      [8]ページ先頭

      ©2009-2025 Movatter.jp