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

Is there a better way to do this than writing a wrapper allocator that stores a reference to a stateful allocator object?

例如:

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<> 编写一个完整的额外包装器 class 更简洁的方法?

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

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

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

  1. "wrapper,""proxy,"或"reference"满足标准的Allocator要求,并为分配的类型取一个模板参数。

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