【问题标题】:How to rebind a custom allocator?如何重新绑定自定义分配器?
【发布时间】:2020-01-07 01:28:05
【问题描述】:

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

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

谁能解释一下它的作用以及为什么我们需要实现这个接口? 非常感谢。

Full source code

【问题讨论】:

  • “我在几乎所有分配器中都发现了这段代码。”你有参考资料吗?
  • @AntonStafeyev 您发布/链接的内容并不是非常地道的 C++ 代码,我不会将其用作参考。
  • 这很公平。我的观点很简单,这不是典型的代码,你不会在“几乎所有的分配器”中找到它。事实上,我从未见过类似的逻辑,而且据我所知,实现此代码的人也并不真正了解 C++ 分配器。
  • 老实说,我强烈建议您不要学习分配器,直到您对 C++ 相当先进。它们非常容易出错,这就是为什么它们的规范会继续在新的 C++ 版本中重写。也许Howard Hinnant’s article 有一些见解。

标签: c++ std


【解决方案1】:

将分配器想象成一个类型化的接口,引用一些底层的非类型化存储。许多分配器可能会引用相同的存储。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-20
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多