Wal*_*ter 5 c++ user-interface memory-management allocation c++11
我想以从 派生的类的形式使用一些符合 C++ 标准的内存管理std::allocator,但能够分配内存块并以较小的部分释放它们。我只找到了 boost::pool,但这在上述意义上不符合标准。有什么更有用的东西还是我必须自己编写代码?
(请注意,std::allocator对于分配许多小对象,即使用 时,通常是无用的std::list。)
编辑以澄清。
比如说,我想使用std::list许多小对象中的一个,然后std::allocator使用分配每个对象的实现::new会导致运行时的巨大开销(而且我认为还有内存)。分配大块对象并将它们一一分发会更有效。为此,我需要一个std兼容的分配器(不需要从 派生std::allocator,但必须实现相同的概念),它可以与任何库容器一起使用std并提供所需的内存管理,理想情况下允许我告诉它有多少个对象我可能会单独分配。
GCC 提供了一些扩展分配器作为std::allocator.
你还没有真正说出你的要求是什么,所以不可能说它们是否适合你。
编辑以下OP的编辑:
比如说,我想使用
std::list许多小对象中的一个,然后std::allocator使用分配每个对象的实现::new会导致运行时的巨大开销(而且我认为还有内存)。
为什么还有记忆?std::list无论内存来自还是自定义分配器,每个节点中的附加指针的开销都会存在new。您只是指由堆完成的簿记以跟踪所有小的 allcoating 吗?
分配大块对象并将它们一一分发会更有效。
你测量过吗?
如果您不希望分配大量单独节点的开销,您确定std::list是正确的容器吗?vector或呢deque?
boost::stable_vector仍然是基于节点的,但每个节点的内存开销比std::list.
Aboost::flat_map<int, T>不是基于节点的,可以用来代替std::list<T>
分配器很棘手,并且并不总是(实际或感知的)问题的最佳答案。