为什么boost::fast_pool_allocator构建在一个单独的池之上,而不是每个分配器实例一个单独的池?或者换一种说法,为什么只提供这一点,而不是每个分配器有一个池的选项?这样做会不会是个坏主意?
我有一个在内部使用大约10种不同boost::unordered_map类型的类。如果我使用std::allocator,那么当系统调用delete时,所有的内存都会返回到系统,而现在我不得不在某个时刻对许多不同的分配器类型调用release_memory。如果我使用自己的分配器而不是singleton_pool,那会不会很愚蠢呢?
谢谢
发布于 2010-03-31 08:30:57
分配器很难有状态,因为一个分配器的所有实例都必须是“等价的”才能被标准库使用(至少是可移植的)。
来自20.1.5/4“分配器要求”:
本国际标准中描述的容器的
实现允许假定它们的分配器模板参数满足表32中以外的以下两个额外要求。
然后它继续说:
鼓励
实现者提供可以接受分配器的库,这些分配器封装了更通用的内存模型,并支持不相等的实例。在这样的实现中,除了表32中出现的那些要求之外,容器对分配器施加的任何要求,以及当分配器实例比较不相等时容器和算法的语义,都是由实现定义的。
因此,可以编写一个实现来允许不等价的分配器实例,但是您的分配器依赖于实现定义的行为。
有关更多细节,请参阅this other SO answer (看起来我需要注意该答案的一些承诺更新……)
https://stackoverflow.com/questions/2549602
复制相似问题