以前在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 了