相关Memory Pool的使用

自从很久以前看了侯捷老师的《池内春秋》一文后
就有想把sgi stl中的memory pool搞出来自己用
但是一直没动手……
要学的东西实在是太多了……

认为只要大量使用std::container就可以不用自己写内存池了
例如用std::vector<char>代替new char []

上次C++大会,听到云风谈到在写server端时,自己操作内存池是很有必要的

12月份看到《游戏创造》中有一文已实现了最初的想法
照文中所说去网站却下载不到源码,郁闷……

开始自己动手翻资料写程序
原来很简单……
None.gif struct  Base
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
float sz[64];
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*
InBlock.gif    virtual ~Base()
InBlock.gif    {
InBlock.gif    }
ExpandedSubBlockEnd.gif
*/

ExpandedBlockEnd.gif}
;
None.gif
None.gif
struct  Test :  public  Base
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedBlockEnd.gif}
;
None.gif
None.gif
struct  TestAlloc :  public  Base
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
static std::allocator<char> alloc;
InBlock.gif
InBlock.gif    
static void *operator new(size_t size)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (size > 128)
InBlock.gif            
return ::operator new(size);
InBlock.gif        
else
InBlock.gif            
return alloc.allocate(size);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
static void operator delete(void* p, size_t size)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (size > 128)
InBlock.gif            ::
operator delete(p);
InBlock.gif        
else
InBlock.gif            alloc.deallocate(static_cast
<char *>(p), size);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
;
None.gifstd::allocator
<   char   >  TestAlloc::alloc;
None.gif

测试了一下
None.gif int  _tmain( int  argc, _TCHAR *  argv[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
const Times = 10000000;
InBlock.gif
InBlock.gif    DWORD begin 
= 0, end = 0;
InBlock.gif    
InBlock.gif    begin 
= GetTickCount();
InBlock.gif    
for (size_t n=0; n<Times; ++n)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Test 
*= new Test;
InBlock.gif        delete p;
ExpandedSubBlockEnd.gif    }

InBlock.gif    end 
= GetTickCount();
InBlock.gif    std::cout 
<< "Test time :" << end - begin << std::endl;
InBlock.gif
InBlock.gif
InBlock.gif    begin 
= GetTickCount();
InBlock.gif    
for (size_t n=0; n<Times; ++n)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        TestAlloc 
*= new TestAlloc;
InBlock.gif        delete p;
ExpandedSubBlockEnd.gif    }

InBlock.gif    end 
= GetTickCount();
InBlock.gif    std::cout 
<< "TestAlloc time :" << end - begin << std::endl;
InBlock.gif
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

None.gif

发现要比普通的快近一倍
但是也正如文中所说,>128 bytes的还是使用::operator new/delete
不爽ing~

再仔细看文章
发现一个关键字 Doug Lea
然后找到这里 http://gee.cs.oswego.edu/dl/html/malloc.html
发现他的想法与sgi stl类似,但是没有128的限制,竟然是
malloc2.gif 

爽了~

备份资料
引用自 http://www-128.ibm.com/developerworks/cn/linux/l-memory/?ca=dwcn-newsletter-linux#resources

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
Web 上的文档 基本的分配程序 池式分配程序 智能指针和定制分配程序
  • Loki C++ Library 有很多为 C++ 实现的通用模式,包括智能指针和一个定制的小对象分配程序。
垃圾收集器 关于现代操作系统中的虚拟内存的文章 关于 malloc 的文章 关于定制分配程序的文章 关于垃圾收集的文章 Web 上的通用参考资料 书籍 来自 developerWorks
  • 自我管理数据缓冲区内存 (developerWorks,2004 年 1 月)略述了一个用于管理内存的自管理的抽象数据缓存器的伪 C (pseudo-C)实现。

  • A framework for the user defined malloc replacement feature (developerWorks,2002 年 2 月)展示了如何利用 AIX 中的一个工具,使用自己设计的内存子系统取代原有的内存子系统。

  • 掌握 Linux 调试技术 (developerWorks,2002 年 8 月)描述了可以使用调试方法的 4 种不同情形:段错误、内存溢出、内存泄漏和挂起。

  • 处理 Java 程序中的内存漏洞 (developerWorks,2001 年 2 月)中,了解导致 Java 内存泄漏的原因,以及何时需要考虑它们。

  • developerWorks Linux 专区中,可以找到更多为 Linux 开发人员准备的参考资料。

  • 从 developerWorks 的 Speed-start your Linux app 专区中,可以下载运行于 Linux 之上的 IBM 中间件产品的免费测试版本,其中包括 WebSphere® Studio Application Developer、WebSphere Application Server、DB2® Universal Database、Tivoli® Access Manager 和 Tivoli Directory Server,查找 how-to 文章和技术支持。

  • 通过参与 developerWorks blogs 加入到 developerWorks 社区。

  • 可以在 Developer Bookstore Linux 专栏中定购 打折出售的 Linux 书籍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值