c++ - 优先队列中的池内存分配

标签 c++ priority-queue event-driven

我正在编写一个基于事件的模拟器,其中每个事件都会调用一个可以生成新事件的处理函数(节点),等等。 时间戳与每个事件相关联,它们需要按时间递增的顺序进行处理(但事件不一定按该顺序创建)。为此,我使用了一个简单的 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/

相关文章:

c++ - 我在使用 boolean 接受器时遇到问题

java - TynyVM 与 LegOS 配合使用时出现异常

c++ - 缩小 std::priority_queue

c++ - nodejs 与运行 libevent 有何不同?

rest - 微服务 Saga 模式消费者等待响应

c++ - Qt开发lib和跨平台截屏是真的吗?

c++ - 字符数组初始化和尾随 null

c++ - Bjarne Stroustrup Book - vector 和 For 循环 - 不起作用

python - 如何在 Python 中实现多处理优先级队列?

apache-kafka - Kafka 事件携带的状态传输系统是否应该使用 GlobalKTable 进行本地查询来实现?