gpt4 book ai didi

c++ - 有没有比编写存储对有状态分配器对象的引用的包装器分配器更好的方法来做到这一点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:54 24 4
gpt4 key购买 nike

例如:

struct Foo {
MyPoolAlloc<char> pool;
std::vector<int , MyPoolAlloc<char>> vec_int; // The wrapper allocator would replace MyPoolAlloc<> here.
std::vector<std::function<void()> , MyPoolAlloc<char>> vec_funcs; // The wrapper allocator would replace MyPoolAlloc<> here.

Foo() : vec_int(pool) , vec_funcs(pool) {}

// I want to store lambdas with captured variables using the custom allocator as well:
template<typename Func>
void emplace_back(const Func& func) {
vec_funcs.emplace_back(std::allocator_arg , pool , func);
}
};

在上面的代码中,我希望所有分配(除了池本身)都来自同一个 pool目的。编写一个存储对实际有状态分配器对象的引用的包装器分配器是执行此操作的最佳方法吗?然后将以下内容传递给构造函数(示例):

: vec_int ((MyWrapperAlloc<char>(pool)));

有没有比为 MyPoolAlloc<> 编写一个额外的包装类更简洁的方法呢? ?

最佳答案

标准的“Allocator”概念最好命名为“AllocatorReference”。每个对象要么引用一个全局实例(无状态),要么引用一个外部对象(有状态)。

无论哪种方式,分配器感知容器中的分配器实例本身并不拥有内存池。它只是一个代理。请注意,分配器对象经常被复制,因为它们被重新绑定(bind)并按值返回。您不希望 vector::get_allocator 复制整个内存池。

所以,是的,您需要两个类。

  1. 满足标准分配器要求并采用分配类型的模板参数的“包装器”、“代理”或“引用”。

  2. 与 Allocator 接口(interface)无关但知道如何执行分配的内存池。

关于c++ - 有没有比编写存储对有状态分配器对象的引用的包装器分配器更好的方法来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30814732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com