内存池

来源:互联网 发布:入侵盗取数据 编辑:程序博客网 时间:2024/05/16 14:36

一、为什么要使用内存池技术呢

主要有两个原因:
     1、减少new、delete次数,减少运行时间,效率的考虑;
     2、避免内存碎片。

解释1:传统的new/delete和malloc和free的弊端:
          (1).分配内存时要查看内存空闲块表,根据一定的算法来分配,比如(将最先找到的不小于申请的大小内存块分配给请求者,将最合适申请大小的空闲内存分配给请求者,或者是分配最大的空闲块内存块),然后更新内存空闲块表。释放的时候,也得在空闲的内存表中加入该释放的内存,或者有必要的话,还得将内存碎片合并为一个大的空闲内存。
           (2).默认的内存管理函数还考虑到多线程的应用,需要再每次分配和释放内存后对该空间进行加锁,同样增加了开销;
           (3).所以频繁的申请和释放还将导致内存碎片,默认的内存管理函数是为了适应更广泛,更复杂的应用情况,增减额外的开销;
解释2:内存碎片
        什么是内存碎片内,从字面意思就很好理解了,就是内存不再是一整块的了,而是碎了。因为连续的这种new/delete操作,一大块内存肯能就被分割成小的内存分配出去了,这些小的内存都是不连续的。当你再去分配大的连续内存的时候,尽管剩余内存的总和可能大于所要分配的内存大小,但系统就找不到连续的内存了,所以导致分配错误。malloc的时候会导致返回NULL,而new的时候再vc6.0中返回NULL,vs2003以上则是抛出异常。

因为系统自带的new和delete,malloc、free有这些弊病,所以有些程序员在处理不多变的某些特定类型的数据的时候就会自己重载new和delete操作符。

二、重载new和delete:
 在下列情况下可以替换编译器提供的operator new或operator delete。
(1)用来检测运行上的错误。如内存越界错误,可以多分配一些空间来进行额外的校验,如果运行前后检验空间中的数据不变,则说明没有出现错误。
(2)为了强化效能。(分配算法,查找空闲,合并,内存碎片,调用库函数耗时)编译器默认的operator new和operator delete是针对泛型提供的,所以效率不是很高,还有可能会浪费空间。如果你仅仅需要处理某种特定类型,可以自己定义new和delete。

(3)为了收集使用上的一些信息。自行定义operator new和operator delete使我们得以能够收集性这些空间分配和其他的信息。

   文章浅显,实践后再补充,未完待续。





博文资料参考:

http://blog.sina.com.cn/s/blog_6002b97001016vd1.html

http://www.cnblogs.com/dylantsou/archive/2012/05/13/2498491.html

http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html

感谢博主的分享。

4 0
原创粉丝点击