C++中的内存池

5

我有一个非常高效的C++库。我正在考虑编写一个内存池,以便我不必使用全局的 newdelete。我进行了一些阅读,但想知道这样做是否有助于提高性能和减少内存泄漏。


3
你是否百分之百确定在你的代码中,new和delete是瓶颈?你进行了性能分析吗? - Paul R
1
http://www.boost.org/doc/libs/1_43_0/libs/pool/doc/index.html - ta.speot.is
性能:如果您的库具有特殊的分配模式,编写一个专门处理您的库的分配器可能会节省时间。内存泄漏:除非您运行某种垃圾收集器,否则不会有任何区别。 - user824425
另外,据我所知,一些 Boost 结构体(例如 regex)不支持自定义分配器。在深入研究之前,请确保您的所有结构体都支持此功能。 - OSH
3个回答

2

除非您有非常具体的理由相信您的库将从自定义分配器中受益,否则很可能不会有太大的帮助。

看起来您正在尝试执行无向优化。不要这样做。首先使用性能分析工具收集性能数据,然后再考虑是否需要进行优化。


1
一个针对你的应用程序精细调整的内存分配器,应该比任何通用分配器表现更好——前提是你的分配模式不同于“通用”的,并且是可预测的。然而,内存泄漏的减少或检测是完全不同的问题,在关注性能之前应该解决它。

0
根据我的经验,实现自己的内存池并不会提高性能。因为在多线程环境下,你必须使用互斥锁来保护池中的内存分配和释放,而互斥锁相对于系统的new/delete来说非常耗费资源。
此外,它也不能帮助减少内存泄漏。要减少内存泄漏,必须确保释放了所有已分配的内存。这应该是通过程序而不是池来解决的问题。
唯一的好处可能是帮助独立地跟踪内存使用情况,不依赖第三方工具。

用户空间/轻量级线程怎么样? - user824425
1
你实际上不必使用互斥锁,这只是你偶然遇到的一种特定实现。你可以完全使用每个线程池、非阻塞原子操作或者其他方法。 - Matthieu M.
"memory" 这个词有点过于笼统。如果这个 "memory" 实际上是一个具有非平凡构造函数/析构函数的对象池,即使加上一些互斥锁/互斥信号量保护,这个对象池也可以更快。 - Martin James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接