5

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

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

编辑澄清。

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

4

1 回答 1

1

GCC 提供了一些扩展分配器作为std::allocator.

您还没有真正说出您的要求是什么,因此无法说其中任何一个是否适合您。

编辑以下 OP 的编辑:

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

为什么还要记忆?std::list无论内存来自new还是自定义分配器,都会出现每个节点中额外指针的开销。你的意思是堆做的簿记来跟踪所有的小分配吗?

分配大块对象并一一分发会效率更高。

你量过吗?

如果您不想要分配大量单独节点的开销,您确定std::list是正确的容器吗?vector或呢deque

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

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

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

于 2012-06-20T12:23:00.587 回答