需要自己建立内存池吗?

这个问题知乎做了讨论,引用一下:https://www.zhihu.com/question/25527491

一般工程里不推荐你写,因为你费力写一个出来99%可能性没有内置的好,且内存出bug难调试
实在闲着蛋疼,你也可以当个玩具写写玩玩

十多年前 libc 还不成熟的情况下,为了程序长时间运行的稳定性,大部分程序员都必须针对自己的应用来实现针对特定情况的内存分配器。当年如果不自己管理内存,很多客户端,如果计算密集频繁分配,才开始可能没什么区别,但跑个几个小时性能立马就下降下来了;服务器进程持续运行个10多天不重启,速度也会越来越慢,碎片多了嘛。如今 libc 的 malloc 也进步了很多,这样的情况比较少了,那你再做一个内存池的意义何在呢?

在你的玩具比较稳定的情况下,终于可以产生一些价值了,因为一些性能指标你无法兼得,标准的分配器往往提供了一个类似保守和中庸的做法,来针对大部分的情况,你可以做的第一步,就是打破这样的平衡,让你的分配器倾向于某些情况比如:

1. 现代计算机内存都很大,你是不是可以牺牲内存利用率为代价换取更高的内存归还/重用的效率?同时换取更快的分配速度?或许你会发现,你可以比 libc 的 malloc 平均浪费 30%内存的代价换来两倍以上的性能提升,在一些内存分配成为瓶颈的应用中起到积极的作用。

2. 比如你可以调整大小内存的比值,libc如果认为 8K以下是小内存,那么你可以不那么认为。

3. 比如如果你的系统就是一个单线程的东西,那么你是否能提供开关,完全以单线程的模式进行运作,完全绕过各种锁和针对多核进行的各种冗余操作呢?

4. 比如你的机器内存有限,你应用需要耗费大量的内存,那么你可以引入其他机制,以牺牲少量性能为代价,换取更好的内存回收效果和内存利用率。

5. 最近分配的对象尽量在线性地址上集中在一起,这样缓存命中高,也不易发生缺页。

6. 比如你程序里面某些对象需要被跟踪,你能否直接在分配器上实现对象跟踪机制,跟踪各种泄漏,越界问题?

7. 每个内存分配都在寻求最佳的公平,你在乎的公平是什么?

。。。。。。


编程C++ 话题的优秀回答者
编程C++ 话题的优秀回答者

一句话:不要低估了各路 malloc 作者的实力,这些都是大神级的人物:Doug Lea、Ulrich Drepper、Poul-Henning Kamp、Jason Evans、Sanjay Ghemawat。
你说的“减少开销/更高效”有数据支持吗?

编程C++ 话题的优秀回答者

知乎用户
知乎用户


如果写着玩玩,韦的高票答案已经很好了。如果是工程上使用,一般来说除了针对特定场景可以考虑用freelist 外,其余就用jemalloc、 tcmalloc 就好,没有必要自己发明

题主想要的估计是Nginx的ngx_pool_t。
github.com/imiskolee/me

把nginx的内存池单独拿出来用了。
目前在公司中在几个平台上使用。
这种内存池的意义,主要是为了避免内存碎片和内存碎块。而ngx_pool_t的前提是场景是web请求这种快速申请快速释放,且流程很线性的系统。桌面应用估计不太适合这种内存分配方式。


编程C++ 话题的优秀回答者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值