Namespaces
Variants

std:: scoped_allocator_adaptor

From cppreference.net
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* )
( 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)
定义于头文件 <scoped_allocator>
template < class OuterAlloc, class ... InnerAllocs >

class scoped_allocator_adaptor

: public OuterAlloc ;
(C++11 起)

std::scoped_allocator_adaptor 类模板是一种可用于多级容器(如vector的set的list的tuple的map等)的分配器。它通过一个外层分配器类型 OuterAlloc 和零个或多个内层分配器类型 InnerAlloc... 进行实例化。直接使用 scoped_allocator_adaptor 构造的容器会使用 OuterAlloc 分配其元素,但如果元素本身是容器,则会使用第一个内层分配器。该容器的元素如果自身也是容器,则使用第二个内层分配器,依此类推。如果容器的层级数超过内层分配器的数量,则最后一个内层分配器会被重复用于所有更深层级的嵌套容器。

此适配器的目的是正确初始化嵌套容器中的有状态分配器,例如当需要将嵌套容器的所有层级置于同一共享内存段时。该适配器的构造函数接收列表中所有分配器的参数,每个嵌套容器根据需要从适配器获取其分配器的状态。

出于 scoped_allocator_adaptor 的目的,若下一层内部分配器为 A ,则任何满足 std:: uses_allocator < T,A > :: value == true 的类 T 均会以容器身份参与递归传递。此外, std::pair 通过 scoped_allocator_adaptor::construct 的特定重载被视作此类容器处理。

典型实现持有一个 std::scoped_allocator_adaptor<InnerAllocs...> 实例作为成员对象。

请注意, std::pmr::polymorphic_allocator 会根据 使用分配器构造 规则传播至嵌套容器,因此不需要(且无法与) std::scoped_allocator_adaptor 协同工作。

目录

嵌套类型

类型 定义
outer_allocator_type OuterAlloc
inner_allocator_type
  • scoped_allocator_adaptor < OuterAlloc > sizeof... ( InnerAllocs ) 为零
  • scoped_allocator_adaptor < InnerAllocs... > 其他情况
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


给定 OuterAlloc InnerAlloc... 的集合作为 Allocs

类型 定义
propagate_on_container_copy_assignment
propagate_on_container_move_assignment
propagate_on_container_swap
is_always_equal

成员函数

创建新的 scoped_allocator_adaptor 对象
(公开成员函数)
销毁 scoped_allocator_adaptor 对象
(公开成员函数)
赋值 scoped_allocator_adaptor
(公开成员函数)
获取 inner_allocator 引用
(公开成员函数)
获取 outer_allocator 引用
(公开成员函数)
使用外层分配器分配未初始化存储
(公开成员函数)
使用外层分配器释放存储
(公开成员函数)
返回外层分配器支持的最大分配大小
(公开成员函数)
在已分配存储中构造对象,若适用则传递内层分配器给其构造函数
(公开成员函数)
销毁已分配存储中的对象
(公开成员函数)
复制 scoped_allocator_adaptor 及其所有分配器的状态
(公开成员函数)
仅用于说明的函数模板
获取最外层分配器
( 仅用于说明的成员函数* )
使用最外层分配器构造对象
( 仅用于说明的成员函数* )
使用最外层分配器销毁对象
( 仅用于说明的成员函数* )

非成员函数

(在 C++20 中移除)
比较两个 scoped_allocator_adaptor 对象
(函数模板)

推导指引 (C++17 起)

嵌套类

定义
rebind template < class T >

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

示例

#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);
    // 在共享内存中创建向量的向量
    ipc_matrix v(s.get_segment_manager());
    // 对于所有这些添加操作,内部向量从外部向量的 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");
}

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 2108 C++11 无法判断 scoped_allocator_adaptor 是否为无状态的 提供 is_always_equal

参见

提供分配器类型的信息
(类模板)
检查指定类型是否支持使用分配器构造
(类模板)
默认分配器
(类模板)