我正在查看 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
对象?
无论如何都需要指针强制转换
这是一个误会。 Allocator 接口允许重新绑定,这就是会发生的情况。分配器
pa
将被反弹以返回指向列表节点的指针。
因此,问题实际上是在引入返回
void*
的多态内存分配工具时,为什么允许将其包装在满足 Allocator 接口(其中返回类型化指针)的东西中? Allocator 接口要老得多,并且自动受到标准容器和第三方容器的支持。 allocator_traits
和 uses_allocator 结构也自动支持它。它还支持 constexpr 构造。
以上所有内容都需要复制内存资源,但效果有限。