Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
以前在codeproject上看到过一篇关于内存池的文章(http://www.codeproject.com/KB/cpp/MemoryPool.aspx)
下载下来试了试,感觉有点问题
想给引擎加入内存池,考虑到当前业余时间在看Loki
就索性使用其SmallObject了
对于内存池当然要求之一那就是速度
其次对我来说我比较关系以下的这类问题
一句话概括就是
Base* ptr = new SubClass;
索性我就根据Loki库和Boost的Object_Pool
设计了如下的引擎内存池(当然问题还很多以后慢慢修改)
#ifdef LOKI_EXT_LIB
#include 
<GEngine/Loki/Loki.hpp>
#else
    
#error 需要包含Loki库
#endif 

namespace core
{

////////////////////////////////////////////////////////////
/// 定义盖莫引擎2.1.2内存池对象 
////////////////////////////////////////////////////////////    
struct MemoryPool    
{
public:
       
    
////////////////////////////////////////////////////////
    
/// 获取,释放指定大小的内存 
    
////////////////////////////////////////////////////////        
    template<class T>
    
static T* Malloc(size_t size)
    {   
        
return (T*)MEMORY_POOL.Allocate(size,false);
    }   
    
    template
<class T>
    
static void  Free(T* ptr,size_t size)
    {
        MEMORY_POOL.Deallocate(ptr,size);      
    }
    
    
////////////////////////////////////////////////////////
    
/// 构造无参数的对象类型并返回指针 
    
////////////////////////////////////////////////////////       
    template<class T>
    
static T* Construct()
    {   
        
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);  
        
if(ptr == NULL)
            
return NULL; 
        
new(ptr)T();
        
return (T*)ptr;        
    }
    
    
////////////////////////////////////////////////////////
    
/// 构造带有1个参数的对象类型并返回指针 
    
////////////////////////////////////////////////////////      
    template<class T,class P1>
    
static T* Construct(const P1 &p1)
    {   
        
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);  
        
if(ptr == NULL)
            
return NULL; 
        
new(ptr)T(p1);
        
return (T*)ptr;        
    }
 
    
////////////////////////////////////////////////////////
    
/// 构造带有2个参数的对象类型并返回指针 
    
////////////////////////////////////////////////////////      
    template<class T,class P1,class P2>
    
static T* Construct(const P1 &p1,const P2 &p2)
    {   
        
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);  
        
if(ptr == NULL)
            
return NULL; 
        
new(ptr)T(p1,p2);
        
return (T*)ptr;        
    }
    
    
////////////////////////////////////////////////////////
    
/// 构造带有3个参数的对象类型并返回指针 
    
////////////////////////////////////////////////////////    
    template<class T,class P1,class P2,class P3>
    
static T* Construct(const P1 &p1,const P2 &p2,const P3 &p3)
    {   
        
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);  
        
if(ptr == NULL)
            
return NULL; 
        
new(ptr)T(p1,p2,p3);
        
return (T*)ptr;        
    }
    
    
////////////////////////////////////////////////////////
    
/// 构造带有4个参数的对象类型并返回指针 
    
////////////////////////////////////////////////////////      
    template<class T,class P1,class P2,class P3,class P4>
    
static T* Construct(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4)
    {   
        
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);  
        
if(ptr == NULL)
            
return NULL; 
        
new(ptr)T(p1,p2,p3,p4);
        
return (T*)ptr;        
    }    
    
    
////////////////////////////////////////////////////////
    
/// 构造带有5个参数的对象类型并返回指针 
    
////////////////////////////////////////////////////////      
    template<class T,class P1,class P2,class P3,class P4,class P5>
    
static T* Construct(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5)
    {   
        
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);  
        
if(ptr == NULL)
            
return NULL; 
        
new(ptr)T(p1,p2,p3,p4,p5);
        
return (T*)ptr;        
    }                
   
    
////////////////////////////////////////////////////////
    
/// 给定对象的析构(size为对象大小) 
    
////////////////////////////////////////////////////////      
    template<class T>
    
static void Destruct(T* ptr, size_t size)
    {   
        
if(ptr == NULL || size <= 0)
            
return;
        ptr
->~T();    
        MEMORY_POOL.Deallocate(ptr,size);    
    }
    
    
////////////////////////////////////////////////////////
    
/// 获取可分配的最大对象大小 
    
//////////////////////////////////////////////////////// 
    static int GetMaxObjSize()
    {    
        
return MEMORY_POOL.GetMaxObjectSize();
    }
    
    
////////////////////////////////////////////////////////
    
/// 获取字节对齐字节数 
    
////////////////////////////////////////////////////////  
    static int GetAlignment()
    {   
        
return MEMORY_POOL.GetAlignment();
    }    
}; 
静态的Malloc和Free是分配和释放原生态的内存
而Construct,Destruct则是构造和析构对象形式的内存
这里提供了6个版本的Construct函数
分别对应0-5个构造函数参数

记得以前遇到的一个问题
那就是假如有一个对象 她没有默认构造函数(只有带参数构造函数)
如果现在需要分配N个她该如何操作?
那就是placement new 了

posted on 2010-04-20 15:56 ccsdu2009 阅读(747) 评论(0)  编辑 收藏 引用 所属分类: Game引擎

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理