【发布时间】:2021-06-21 16:28:28
【问题描述】:
我已经开始在我的项目中使用 pmr::allocators,并且我已经看到使用它们带来了很多性能提升和优势。我使用的分配器与我在下面的简单示例中展示的非常相似:
#include <array>
#include <boost/container/flat_map.hpp>
#include <cassert>
#include <iostream>
#include <memory_resource>
#include <string>
#include <vector>
struct MessageBody {
using map_t = boost::container::flat_map<
char, char, std::less<char>,
std::pmr::polymorphic_allocator<std::pair<char, char>>>;
using vector_t = std::vector<char, std::pmr::polymorphic_allocator<char>>;
MessageBody(std::pmr::memory_resource& mem_v,
std::pmr::memory_resource& mem_m)
: vec_(0, &mem_v), map_(&mem_m) {}
vector_t vec_;
map_t map_;
};
int main() {
std::array<char, 1000> buffer;
buffer.fill('\0');
std::pmr::monotonic_buffer_resource vec_mem(buffer.data(), 500,
std::pmr::null_memory_resource());
std::pmr::monotonic_buffer_resource map_mem(buffer.data() + 500, 500,
std::pmr::null_memory_resource());
{
MessageBody message(vec_mem, map_mem);
message.vec_.push_back('1');
assert(message.vec_.size() == 1);
}
{
MessageBody message(vec_mem, map_mem);
assert(message.vec_.size() == 1); /// I want to adopt the previous class for a new class.
}
}
我的问题是,是否有任何方法可以将 memory_resources 用于另一个类,而无需在 vector 和 map 中重新填充整个数据。
我能想到的唯一方法(我知道这是一个糟糕的主意)是实现一个继承自 std::vector 的新类,该类有一个采用数据方法来设置 size在不修改缓冲区的情况下将向量内部的大小调整为先前使用的向量的大小。
这里是示例的godbolt链接。
【问题讨论】:
-
我认为你最好使用移动构造来实现这一点。多态分配器就是这样,分配器。没有期望它们在提供给容器时会被解释为一些缓冲区(此外,使用
std::pmr::vector) -
@AndyG 也许我应该使用不同的示例。假设您正在从文件或其他形式的 IO 中读取缓冲区。那么移动几乎没有意义。如果可能的话,你想采用记忆并使用它。类似的想法,如 gsl::span for std::vector
-
@apramc 问题说明“为另一个班级”。这似乎排除了从文件或其他 I/O 读取的可能性。顺序不是:从文件读取到第一类,然后将数据从第一类移动到另一个类吗?问题适用于移动而不是阅读?在阅读完成之前,你不会有什么可以采用的。
-
看来我正确地理解了这里的用例。这不是 pmr 分配器会做的事情。需要有状态的分配器和花式指针both of which are not supported by PMR。可悲,但可以理解。目的并不一致。
标签: c++ boost c++14 c++17 allocator