【问题标题】:how to create an allocator for std::map using a pool of objects如何使用对象池为 std::map 创建分配器
【发布时间】:2010-10-31 10:04:57
【问题描述】:

这是stl allocator, copy constructor of other type, rebind的后续报道

我正在使用 std::map 并想要一个自定义分配器,它可以为内部节点重用存储。存储的项目是指针,所以我不是在谈论重用它们,只是地图的内部分配。

主要要求是map的不同实例不能共享一个对象池,每个实例必须是唯一的。

我不需要一个完整的解决方案,我只是想知道如何处理需要不同类型的分配器的所需复制构造函数。在那种情况下,我不知道如何管理内部存储器。

【问题讨论】:

标签: c++


【解决方案1】:

正如您在另一个问题中指出的那样,分配器不应该有任何状态。在每个分配器对象中使用线程本地存储或指向内存池的指针:分配器只是成为该池的特定类型接口。

struct MemoryPool {
  // none of this depends on the type of objects being allocated
};

template<class T>
struct MyAllocator {
  template<class U> struct rebind { typedef MyAllocator<U> other; };

  MemoryPool *_pool;  // copied to any allocator constructed

  template<class U>
  MyAllocator(MyAllocator const &other) : _pool(other._pool) {}

  // allocate, deallocate use _pool
  // construct, destruct deal with T
};

【讨论】:

  • 不幸的是,该池是在线程组中使用的,而不仅仅是一个。
  • @edA:那么池的方法应该是线程安全的。如果 each 映射应该使用不同的池,则使其成为分配器的数据成员,在复制分配器时不会复制该数据成员。这打破了一些 STL 要求,但如果你小心的话,你可以使用它,否则你将不得不使用不同的容器类。 (std::map 写起来并不难。)
  • 这个池是基于原始内存,而不是高级对象。这可能会让我有所收获,但我不确定。我希望避免自己编写地图,但当我看到限制时,这可能是不可避免的。
  • @edA:是的,池只处理大小的内存块(就像 malloc 一样),而分配器处理每种类型的细节(构造、销毁)。
  • 如果我的回答有问题,除了投反对票,我还想知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2011-02-16
  • 2015-03-27
  • 2023-03-29
  • 2011-09-11
相关资源
最近更新 更多