boost pool_alloc

mr *_*mpy 6 c++ singleton boost pool

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

我有一个内部使用大约10种不同的boost :: unordered_map类型的类.如果我使用了std :: allocator,那么当它调用delete时,所有内存都将返回系统,而现在我必须在许多不同的分配器类型上调用release_memory.滚动我自己的使用pool而不是singleton_pool的分配器会不会很愚蠢?

谢谢

Mic*_*urr 4

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

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

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

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

然后它接着说:

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

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

请参阅另一个 SO 答案以获取一些其他详细信息(看起来我需要倾向于对该答案进行一些承诺的更新......)