c++ - 如何重新绑定自定义分配器?
问题描述
我需要一个用于 STL 向量和映射的自定义分配器,以便它在预分配的内存块中“分配”内存。我遇到了几乎所有分配器中的这段代码。
Allocator(const Allocator<U, growSize> &other)
{
if (!std::is_same<T, U>::value)
rebindAllocator = new std::allocator<T>();
}
有人可以解释一下它的作用以及为什么我们需要实现这个接口吗?提前非常感谢。
解决方案
将分配器视为引用某些底层无类型存储的类型化接口。许多分配器可能引用相同的存储。
分配器需要允许重新绑定,以便T
可以将分配器转换为用于U
引用相同存储的分配器。分配器必须是可复制构造的,并且分配器的副本必须引用相同的存储。请参阅 cppreference。
这个分配器实现也是存储。它来自内存池。因此,它需要一种方法让复制的分配器从原始存储中分配和解除分配,而不是它自己的。这是copyAllocator
. 由于尚不清楚的原因,它仅在 Windows 上执行此操作。
同样,反弹分配器需要访问相同的存储。这个分配器似乎违反了这一点并使用std::allocator
. 这意味着它不适合许多 STL 用例。std::map
和其他基于节点的容器将使用反弹分配器进行分配,这意味着它们不会使用内存池。
推荐阅读
- java - 在java中为下一个while循环存储值的while循环
- java - 如何打印或放入一些 HashMap 或其他任何我的查询结果?
- bot-framework-composer - 如何在 bot-framework composer 中使用 post 请求发送 url 编码的表单数据
- typescript - 在 W3C 模式下无法调用非 W3C 标准命令
- monitoring - 使用 Application Insights 自定义警报规则
- python - 单击购物车按钮在 Selenium Webdriver Python 中返回空值
- angular - 如何保存最后的组件更改?
- reactjs - 在 Material-UI 中进行样式设置的惯用方式是什么?
- javascript - Next 未定义 next(err)
- google-cloud-platform - Google Cloud 上的 Kubernetes (GKE):从 Traefik 获取客户端的真实 IP