首页 > 解决方案 > 如何重新绑定自定义分配器?

问题描述

我需要一个用于 STL 向量和映射的自定义分配器,以便它在预分配的内存块中“分配”内存。我遇到了几乎所有分配器中的这段代码。

    Allocator(const Allocator<U, growSize> &other)
    {
        if (!std::is_same<T, U>::value)
            rebindAllocator = new std::allocator<T>();
    }

有人可以解释一下它的作用以及为什么我们需要实现这个接口吗?提前非常感谢。

完整的源代码

标签: c++std

解决方案


将分配器视为引用某些底层无类型存储的类型化接口。许多分配器可能引用相同的存储。

分配器需要允许重新绑定,以便T可以将分配器转换为用于U引用相同存储的分配器。分配器必须是可复制构造的,并且分配器的副本必须引用相同的存储。请参阅 cppreference。

这个分配器实现也是存储。它来自内存池。因此,它需要一种方法让复制的分配器从原始存储中分配和解除分配,而不是它自己的。这是copyAllocator. 由于尚不清楚的原因,它仅在 Windows 上执行此操作。

同样,反弹分配器需要访问相同的存储。这个分配器似乎违反了这一点并使用std::allocator. 这意味着它不适合许多 STL 用例。std::map和其他基于节点的容器将使用反弹分配器进行分配,这意味着它们不会使用内存池。


推荐阅读