std::pmr::polymorphic_allocator 的用途是什么?

问题描述 投票:0回答:1

我正在查看 C++ Reference 中的这个示例

std::array<std::byte, total_nodes * 32> buffer; // enough to fit in all nodes
std::pmr::monotonic_buffer_resource mbr{buffer.data(), buffer.size()};
std::pmr::polymorphic_allocator<int> pa{&mbr};
std::pmr::list<int> list{pa};
for (int i{}; i != total_nodes; ++i)
    list.push_back(i);

据我了解,

mbr
是实际分配内存并返回
void*
的那个。

pa
只是某种类型适配器,并返回
int*
。然而,
list<int>
节点实际上并不是
int
。它们也包含指针。所以
list.push_back()
无论如何都需要指针转换。

std::pmr::polymorphic_allocator
存在有理由吗?为什么
std::pmr
容器不直接接受
std::pmr::memory_resource
对象?

c++ memory-management c++17 c++pmr
1个回答
0
投票

无论如何都需要指针强制转换

这是一个误会。 Allocator 接口允许重新绑定,这就是会发生的情况。分配器

pa
将被反弹以返回指向列表节点的指针。

因此,问题实际上是在引入返回

void*
的多态内存分配工具时,为什么允许将其包装在满足 Allocator 接口(其中返回类型化指针)的东西中? Allocator 接口要老得多,并且自动受到标准容器和第三方容器的支持。
allocator_traits
uses_allocator 结构也自动支持它。它还支持 constexpr 构造。

以上所有内容都需要复制内存资源,但效果有限。

© www.soinside.com 2019 - 2024. All rights reserved.