• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            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 閱讀(755) 評論(0)  編輯 收藏 引用 所屬分類: Game引擎
             
            999久久久免费精品国产| 久久中文字幕一区二区| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久精品国产亚洲AV嫖农村妇女 | 人妻系列无码专区久久五月天| 久久久久国产成人精品亚洲午夜| 久久久久无码专区亚洲av| 无码国产69精品久久久久网站| 97精品国产97久久久久久免费| 中文精品99久久国产 | 久久青草国产精品一区| 亚洲精品乱码久久久久久蜜桃 | 91精品国产91久久| 少妇无套内谢久久久久| 国产成人精品综合久久久| 色偷偷久久一区二区三区| 欧美粉嫩小泬久久久久久久 | 国产精品无码久久久久久| 亚洲人成网站999久久久综合 | 久久综合九色综合久99| 久久久www免费人成精品| 欧美粉嫩小泬久久久久久久 | 88久久精品无码一区二区毛片 | 久久本道综合久久伊人| 国产精品久久午夜夜伦鲁鲁| 久久人人爽人人爽人人片AV东京热| 久久免费小视频| 国产成人久久精品区一区二区| 麻豆精品久久久久久久99蜜桃| 久久国产成人午夜aⅴ影院 | 久久青青草原国产精品免费 | 亚洲美日韩Av中文字幕无码久久久妻妇| 久久精品亚洲中文字幕无码麻豆| 久久精品国产亚洲AV忘忧草18| 人妻系列无码专区久久五月天| 久久久精品日本一区二区三区| 中文字幕久久欲求不满| 国产叼嘿久久精品久久| 很黄很污的网站久久mimi色| 精品无码久久久久久国产| 久久精品99无色码中文字幕|