注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

关于内存池hash表  

2010-07-05 23:56:23|  分类: 网络开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        前段时间写了一个简单的、WIndows平台的内存池,之后移植到linux/Unix系统。但是,由于在Windows平台未经严格测试,存在不少问题。

        到目前为止,这个库共包含6个模板类,其中有内存池、基于内存池的链表、基于内存池的hash表等。在Linux系统测试,发现总是出现内存非法访问之类的问题。虽然我知道这只是个别地方导致的,只需要修复这几个地方,就可以解决问题。但是,我还是决定丢弃这个内存池hash表,同时减少内存池的使用频率(只保留日志模块的内存池)。

        误区一。我之所以反感STL库,是因为当初刚开始没仔细学,而且每次都使用vector向量表,并且在多线程中大量使用。vector向量表是会进行内存重新分配的,例如,元素个数增加时,重新分配内存。显然,在多线程中访问,必然出问题。

        没了STL,只能自己写模板类。所以,我总是自己写基于模板的链表。而在想写内存池时,我就很自然地想到自己写,同时使用模板写。

        误区二。当然,即使这样,也不会导致太大的问题。但是,我接着犯下第二个致命错误。为了确保内存的连续性,最大限度地减少内存碎片,我把链表节点的所有数据全部放到内存块中。这是很巧妙的设计,也是很LJ的设计。此外,对于每个节点,我又增加了访问计数器。如果计数器大于0,就不释放空闲内存。

        误区三。模板套模板,模板套内存池,复杂的嵌套,加大了调试难度,以至于我根本无法在内存溢出时找到错误的起因!

        事实上,STL库本身就考虑了碎片问题,而如果使用map、list、deque这些库,完全足够了。所以,在今天测试和分析出以上问题之后,我决定放弃自己的hash表,改用map类;放弃基于内存池的链表,改用list和deque。

        明天开始对STL库进行封装。其实,现在只要做一个简单稳定的就OK,后面再一步一步地修复。

  评论这张
 
阅读(739)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016