34|快速分配和释放内存:内存池
该思维导图由 AI 生成,仅供参考
一个测试用例
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了内存池技术的使用场景、测试方法和实现策略。通过介绍内存池的理由和反对意见,并展示了内存池的作用及不同平台和编译器对性能的影响。详细介绍了C++的内存池资源(PMR)和多态分配器,并讨论了自定义内存池的基本策略,包括减少向系统内存分配器请求内存的次数、对象类型和大小的关系、内存返回策略等。文章还探讨了内存池在类特定的分配和释放函数以及分配器中的应用,展示了内存池在不同场景下的性能提升。通过具体的测试和实现策略,本文深入探讨了内存池的使用和优化技术,对于需要了解内存池的读者具有一定的参考价值。文章还提出了课后思考问题,鼓励读者练习代码并尝试不同的解决方案,以加深对内存池的理解。整体而言,本文对内存池技术进行了全面而深入的探讨,为读者提供了宝贵的技术参考。 参考资料: 1. Google, “gperftools”. <https://github.com/gperftools/gperftools> 2. GNU, “The GNU allocator”. <https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html>
《现代 C++ 编程实战》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- 李云龙老师,为什么第二次插入的时候会变快?似乎所有的性能测试都是这样的,跟局部性和缓存有关系吗?
作者回复: 对,内存已经变“热”了。
2023-11-13归属地:韩国1 - 怪兽请问一下老师,在"内存池应用:类特定的分配和释放函数"小节里,原文说"不管写不写 static,这两个成员函数都是静态的",没明白为什么不写static也是静态的。
作者回复: 规定。这两个必须是静态的,否则没有意义。(对于已经存在的对象怎么 new?)
2022-12-06归属地:上海1 - Geek_595be5上面例子中定义内存数据storage_用的array类型,请问这是单纯出于个人习惯偏好呢?还是array比vector在这里更合适呢?
作者回复: 我就是要一次性分配一块内存出来,array 足矣。这里使用 vector 在时间和空间上都会更差。
2023-08-30归属地:新加坡 - comingt1 = rdtsc(); for (int i = 0; i < LOOPS; ++i) { for (auto &ptr : ptr_array1) { ptr = (normal::Obj*)tc_malloc(sizeof(normal::Obj)); } for (auto ptr : ptr_array1) { tc_free(ptr); } } t2 = rdtsc(); 这种使用tc_malloc方式正确吧, 但是很奇怪啊, 显示CPU周期比较, pooled最慢了 68 cycles for each allocation and deallocations on normal Obj 94 cycles for each allocation and deallocations on pooled Obj 51 cycles for each allocation and deallocations on tcmalloced Obj
作者回复: 开优化了吗?你的数字比我的大多了。 另外,用 tcmalloc 不需要改代码的。直接链接 libtcmalloc.so 就行。
2023-07-17归属地:上海2 - Geek_power老师,请问下参考资料1是您极力推荐的内存管理库吗,我准备研究并往项目使用
作者回复: Linux 下推荐使用。建议先使用 profiling 工具或自己测试性能来比较一下。 任何性能问题都需要测量来得到最后决定需要的数据。
2022-12-28归属地:上海 - 怪兽老师,还有个疑问,在"生命周期陷阱"小节里,有4点描述。其中第2点说"它的析构函数会挂到线程退出需要执行的代码中。注意这比第 1 步要晚",这里的意思是指内存池的析构比全局对象的析构要晚吧。然后第3点又说,"后构造的先析构",意思是内存池的析构比全局对象的析构要早吧?这不矛盾了吗?我哪里理解出问题了?麻烦老师指正一下。
作者回复: 不是。第二点和第三点是一致的。后构造的先析构,晚挂到退出执行链上的代码先执行。
2022-12-06归属地:上海 - 向我开炮 东狗子这就是二十年的功力吗2023-01-16归属地:陕西2
- 03125555居然还在更新!2022-04-0611
- DDRH居然还在更新!太赞了2023-09-10归属地:广东