名稱空間
變體
操作

std::scoped_allocator_adaptor

來自 cppreference.com
< cpp‎ | 記憶體
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
C 庫

分配器
scoped_allocator_adaptor
(C++11)
記憶體資源
垃圾回收支援
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化儲存
(直到 C++20*)
(直到 C++20*)
顯式生命週期管理
 
 
定義於標頭檔案 <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,則任何類 T,對於其 std::uses_allocator<T,A>::value == true,都會像容器一樣參與遞迴。此外,std::pairscoped_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


給定 OuterAllocInnerAlloc...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);
 
    // 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");
}

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 2108 C++11 沒有辦法表明 scoped_allocator_adaptor 是否是無狀態的 提供了 is_always_equal

[編輯] 另見

提供關於分配器型別的資訊
(類模板) [編輯]
檢查指定型別是否支援 uses-allocator 構造
(類模板) [編輯]
預設分配器
(類模板) [編輯]