std:: scoped_allocator_adaptor
|
定义于头文件
<scoped_allocator>
|
||
|
template
<
class
OuterAlloc,
class
...
InnerAllocs
>
class
scoped_allocator_adaptor
|
(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
|
|
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
|
示例
#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
|
参见
|
(C++11)
|
提供分配器类型的信息
(类模板) |
|
(C++11)
|
检查指定类型是否支持使用分配器构造
(类模板) |
|
默认分配器
(类模板) |