6

为什么 boost::fast_pool_allocator 建立在单例池之上,而不是每个分配器实例的单独池?或者换句话说,为什么只提供这个,而不是每个分配器都有一个池的选项?这样做会是个坏主意吗?

我有一个类在内部使用大约 10 种不同的 boost::unordered_map 类型。如果我使用了 std::allocator,那么当它调用 delete 时,所有内存都会回到系统中,而现在我必须在某些时候在许多不同的分配器类型上调用 release_memory。我会愚蠢地推出我自己的使用 pool 而不是 singleton_pool 的分配器吗?

谢谢

4

1 回答 1

4

分配器很难拥有状态,因为分配器的所有实例都必须“等效”才能被标准库使用(至少是可移植的)。

从 20.1.5/4 “分配器要求”开始:

本国际标准中描述的容器的实现允许假设其分配器模板参数满足表 32 中的以下两个附加要求。

  • 给定分配器类型的所有实例都必须是可互换的,并且总是相互比较

然后它继续说:

鼓励实现者提供可以接受分配器的库,这些分配器封装了更通用的内存模型并支持不相等的实例。在这样的实现中,容器对分配器施加的任何要求超出了表 32 中出现的那些要求,以及当分配器实例比较不相等时容器和算法的语义,都是实现定义的。

因此,可以编写一个实现以允许非等效分配器实例,但是您的分配器依赖于实现定义的行为。

有关其他详细信息,请参阅this other SO answer(看起来我需要倾向于对该答案的一些承诺更新......)

于 2010-03-31T00:30:56.767 回答