我正在编写一个基于事件的模拟器,其中每个事件都会调用一个可以生成新事件的处理函数(节点),等等。
时间戳与每个事件相关联,它们需要按时间递增的顺序进行处理(但事件不一定按该顺序创建)。为此,我使用了一个简单的 priority_queue<Event*>
,其中 Event 是一个类,包含指向必须调用的处理节点的指针和时间戳。
因此,一切正常,但我每秒分配和释放数百万个事件,这显然是限制我的模拟器速度的原因(大约 30% 的执行时间用于 Event 对象的内存分配和释放).
我发现了这个问题:
Object pool vs. dynamic allocation看起来我可以从对象池中受益匪浅。虽然我已经看到 Boost 提供了一些方法来做到这一点,但我不确定这对于在 priority_queue
中实现池是否可行。 .在自定义内存分配方面,我真的很迷茫。
所以我的问题是:为我的 priority_queue
使用对象池是否实用/有益? ,如果是,是否有一种简单的方法可以做到这一点,也许有一些代码示例(或至少是一个起点),最好不要在第一次立即依赖 Boost?
实际上,也欢迎提供一些引用资料来了解池分配的工作原理!
谢谢。
最佳答案
是的,这样做非常实用。请记住,内置的动态分配器被构建为尽可能快地用于各种目的——也就是说,它必须分配和取消分配任何大小、任何类型和以任何顺序。如果您事先知道这不是必需的,则可以大大降低分配和取消分配的复杂性。
在这种情况下,您事先知道您总是在分配一个事件。这使对象池成为您的理想分配器。将设计用于 STL 对象的自定义分配器添加到 std::priority_queue
是非常实用的 - 队列在内部容器上模板化,带有 std::vector
作为默认值,您可以在 std::vector
中显式指定自定义分配器。结果应该非常实用且易于使用 - 像对象池一样基于值的自定义内存分配器(据我所知)相当容易插入。
关于c++ - 优先队列中的池内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5238925/