什么C ++ std兼容的自定义分配器可用?

时间:2012-06-20 09:53:29

标签: c++ memory-management user-interface c++11 allocation

我想以std::allocator派生的类的形式使用一些符合C ++标准的内存管理,但能够分配内存块并释放&将它们放在较小的部分中。我只找到了boost :: pool,但是在上面的意义上这不符合标准。有什么更有用的,或者我自己编码吗?

(请注意,std::allocator通常无法分配许多小对象,即使用std::list时。)

编辑澄清。

说,我想使用许多小对象的std::list,然后std::allocator的实现使用::new分配每个对象会导致运行时的大量开销(但我认为还有内存) )。分配大块对象并逐个分发它们会更有效率。为此,我需要一个std兼容的分配器(不需要从std::allocator派生,但必须实现相同的概念),可以与任何std库一起使用容器并提供所需的内存管理,理想情况下允许我告诉它我可能单独分配多少个对象。

1 个答案:

答案 0 :(得分:1)

GCC提供了一些extension allocators作为std::allocator的替代方案。

你还没有真正说出你的要求是什么,所以不可能说它们中的任何一个是否适合你。

编辑以下OP的编辑:

  

说,我想使用许多小对象的std::list,然后std::allocator的实现使用::new分配每个对象会导致运行时的大量开销(但我认为还有内存) )。

为什么还有记忆?无论内存来自std::list还是自定义分配器,每个new节点中的附加指针的开销都将存在。你是说堆的记账是为了追踪所有的小型涂层吗?

  

分配大块对象并逐个分发它们会更有效率。

你有测量吗?

如果您不希望分配大量单独节点的开销,您确定std::list是正确的容器吗?那么vectordeque呢?

boost::stable_vector仍然是基于节点的,但每个节点的内存开销低于std::list

boost::flat_map<int, T>不是基于节点的,可以代替std::list<T>

使用

分配器很棘手,并不总是(真实或感知)问题的最佳答案。