青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

基于ACE實(shí)現(xiàn)的一個(gè)內(nèi)存池-續(xù)篇

針對(duì)上篇文章《基于ACE實(shí)現(xiàn)的一個(gè)內(nèi)存池 》,今天我進(jìn)行了改版,實(shí)之更加方便和合理,代碼如下:
// MemPoolT.h
/**
 *    @date 2007.10.25
 *  @author PeakGao <peakgao163@163.com>
 
*/

 #ifndef OM_MEMPOOLT_H
#define OM_MEMPOOLT_H

#include 
<assert.h>
#include 
<ace/guard_t.h>
#include 
<ace/global_macros.h>

namespace om{

    
/**
        緩沖池

        緩存池采取2維內(nèi)存緩沖機(jī)制,每次new出一個(gè)緩沖鏈,每個(gè)緩沖鏈為
        <GrowBlockCount>個(gè)大小為<BlockSize>的內(nèi)存塊,緩沖鏈之間建立鏈表關(guān)
        系。

        優(yōu)點(diǎn):
        1、緩沖池大小由小變大,動(dòng)態(tài)增長,不是一開始就分配一個(gè)超大的內(nèi)
        存,真正按需分配;
        2、不存在realloc,緩沖地址固定不變;
        3、支持FreeList,高效;

        缺點(diǎn):
        1、分配的對(duì)象在長時(shí)間不用時(shí)沒有實(shí)現(xiàn)智能釋放,以后有需要再改

        要求:
        1、每個(gè)塊的大小必須大于等于sizeof(Node),32位系統(tǒng)上面是4字節(jié)

        示例:
        @code
        class MyObj
        {
        public:
            MyObj()
            {
                std_out<<ACE_TEXT("MyObj::MyObj()")<<std_endl;
            }
            ~MyObj()
            {
                std_out<<ACE_TEXT("MyObj::~MyObj()")<<std_endl;
            }
            void foo()
            {
                std_out<<ACE_TEXT("MyObj::foo()")<<std_endl;
            }
            int dummy; 
        };

        void test()
        {
            using namespace om;
            typedef CachePoolWithLock<ACE_Lock_Adapter<ACE_SYNCH_MUTEX> >            CachePool_Lock;

            CachePool p1;
            p1.create(1024, 256);
            void* pp1 = p1.alloc();
            p1.free(pp1);
            p1.clear();

            CachePool_Lock p2(7, 256);
            void* pp2 = p2.alloc();
            p2.free(pp2);
            p2.clear();


            ObjectPool<MyObj, CachePool_Lock>    pool(128);
            MyObj* o = pool.alloc();
            o->foo();
            pool.free(o);
            pool.clear();
        }
        @endcode
    
*/


    
#define BYTE_ALIGN_8    /// 是否支持塊尺寸8字節(jié)對(duì)齊的開關(guān)宏


    
/**
        緩存池
        這里只實(shí)現(xiàn)邏輯,不考慮線程安全,線程安全的版本見下面的CachePoolWithLock模版
    
*/

    
class CachePool
    
{
    
protected:

        
/// 緩沖鏈: Head + cache1 + cache2 + cacheN (N=BlockCount)
        struct Chain
        
{
            Chain
* _Next;

            
void* data() return this + 1; }

            inline 
static Chain* create(Chain*& head, size_t blockSize, size_t blockCount)
            
{
#if defined(BYTE_ALIGN_8)
                blockSize 
= blockSize ? ((blockSize + 7& ~7) : 8// 8字節(jié)對(duì)齊
#endif
                Chain
* p = (Chain*new char[sizeof(Chain) + blockCount * blockSize];

                p
->_Next = head;
                
return head = p;
            }


            
void free()
            
{
                Chain
* p = this;
                
while (p)
                
{
                    
char* buf = (char*)p;
                    Chain
* next = p->_Next;
                    delete[] buf;
                    p 
= next;
                }

            }

        }
;


        
/// 空閑對(duì)象節(jié)點(diǎn),僅僅在空閑對(duì)象中有效
        struct Node
        
{
            Node
* _Next;
        }
;


        size_t    _BlockSize;            
/// 數(shù)據(jù)塊的字節(jié)大小
        size_t    _GrowBlockCount;    /// 每次連續(xù)分配的塊數(shù)
        Chain*    _ChainList;            /// 每次分配的緩沖鏈
        Node*    _FreeNode;            /// 當(dāng)前空閑節(jié)點(diǎn)

    
public:
        
/// 默認(rèn)構(gòu)造,注意必須調(diào)用create方法初始化參數(shù)
        CachePool()
            : _BlockSize(
0), _GrowBlockCount(0), _ChainList(0), _FreeNode(0)
        
{
        }


        CachePool(size_t blockSize, size_t growBlockCount)
            : _ChainList(
0), _FreeNode(0)
        
{
            create(blockSize, growBlockCount);
        }


        
~CachePool()
        
{
            clear();
        }


        
/// 清除所有的內(nèi)存空間
        void clear()
        
{
            
if (_ChainList)
            
{
                _ChainList
->free();
                _ChainList 
= 0;
                _FreeNode 
= 0;
            }

        }


        
/// 初始化參數(shù)
        void create(size_t blockSize, size_t growBlockCount)
        
{
            _BlockSize 
= blockSize;
            _GrowBlockCount 
= growBlockCount;

            assert(_GrowBlockCount 
>= 1);
            assert(_BlockSize 
>= sizeof(Node));
        }


        
/// 獲取塊的大小
        size_t getBlockSize() const
        
{
            
return _BlockSize;
        }


        
/// 獲取連續(xù)分配的塊的數(shù)目
        size_t getGrowBlockCount() const
        
{
            
return _GrowBlockCount;
        }


        
/// 分配一個(gè)塊內(nèi)存
        void* alloc()
        
{
            assert(_GrowBlockCount 
>= 1);
            assert(_BlockSize 
>= sizeof(Node));

            
if (_FreeNode == 0)
            
{
                
// 分配另一個(gè)數(shù)據(jù)鏈
                Chain* newChain = Chain::create(_ChainList, _BlockSize, _GrowBlockCount);

                Node
* node = (Node*)newChain->data();

                
// 定位到最后一個(gè)節(jié)點(diǎn)
                (char*&)node += _BlockSize * (_GrowBlockCount - 1);

                
// 建立連接關(guān)系
                for (int i=(int)_GrowBlockCount-1; i>=0; i--, (char*&)node -= _BlockSize)
                
{
                    node
->_Next = _FreeNode;
                    _FreeNode 
= node;
                }

            }


            assert(_FreeNode 
!= 0);

            
void* block = (void*)_FreeNode;
            _FreeNode 
= _FreeNode->_Next;

            
return block;
        }


        
/// 釋放塊內(nèi)存
        void free(void* block)
        
{
            
if (block != 0)
            
{
                Node
* node = (Node*)block;
                node
->_Next = _FreeNode;
                _FreeNode 
= node;
            }

        }

    }
;




    
/*
        支持鎖策略的緩存池,目前用的ACE的鎖,可以很方便的改為其他的鎖策略
        比如_ACELOCK可以為鎖對(duì)象ACE_Lock_Adapter<ACE_SYNCH_MUTEX>,也可以
        直接用互斥體如ACE_SYNCH_NULL_MUTEX
    
*/

    template
<class ACELOCK>
    
class CachePoolWithLock : public CachePool
    
{
    
protected:
        ACELOCK        _Lock;            
/// 鎖

    
public:
        CachePoolWithLock()
        
{
        }


        CachePoolWithLock(size_t blockSize, size_t growBlockCount)
            : CachePool(blockSize, growBlockCount)
        
{
        }


        
/// 清除所有的內(nèi)存空間
        void clear()
        
{
            ACE_GUARD(ACELOCK, ace_mon, _Lock);
            CachePool::clear();
        }


        
/// 分配一個(gè)塊內(nèi)存
        void* alloc()
        
{
            ACE_GUARD_RETURN(ACELOCK, ace_mon, _Lock, NULL);
            
return CachePool::alloc();
        }


        
/// 釋放塊內(nèi)存
        void free(void* block)
        
{
            ACE_GUARD(ACELOCK, ace_mon, _Lock);
            CachePool::free(block);
        }

    }
;

    
/**
        對(duì)象池
        在緩沖池的基礎(chǔ)上,增加了對(duì)象的構(gòu)造和析構(gòu)為了更好擴(kuò)充,模版參數(shù)直接傳入緩沖池類型,可
        以是上面的CachePool、CachePoolWithLock,也可以是用戶自定義的緩沖池,但必須符合調(diào)用規(guī)范
    
*/

    template
<class T, class CachePoolStrategy>
    
class ObjectPool : public CachePoolStrategy
    
{
    
protected:
        typedef CachePoolStrategy _Base;

    
public:
        ObjectPool()
        
{
        }


        ObjectPool(size_t growBlockCount)
            : _Base(
sizeof(T), growBlockCount)
        
{
        }


        
/// 初始化參數(shù)
        void create(size_t growBlockCount)
        
{
            _Base::create(
sizeof(T), growBlockCount);
        }


        
/// 創(chuàng)建對(duì)象的內(nèi)存空間,但是沒有進(jìn)行構(gòu)造,用戶可以自行進(jìn)行定制的構(gòu)造
        T* alloc()
        
{
            
void* obj = _Base::alloc();
            ::
new (obj) T(); // 只提供了采用默認(rèn)構(gòu)造的方式
            return (T*)obj;
        }


        
/// 釋放對(duì)象
        void free(T* obj)
        
{
            
if (obj != 0)
            
{
                obj
->~T();
                _Base::free(obj);
            }

        }

    }
;

}
 // namespace om

#endif // OM_MEMPOOLT_H

posted on 2007-10-29 12:43 PeakGao 閱讀(2730) 評(píng)論(2)  編輯 收藏 引用 所屬分類: C++技術(shù)

評(píng)論

# re: 基于ACE實(shí)現(xiàn)的一個(gè)內(nèi)存池-續(xù)篇 2008-02-21 08:53 感恩的心

good  回復(fù)  更多評(píng)論   

# re: 基于ACE實(shí)現(xiàn)的一個(gè)內(nèi)存池-續(xù)篇 2009-05-08 23:33 imdavid

沒看出來和其他的mmpl 有什么不同, 請(qǐng)作者講下.

好一點(diǎn)的都是自己實(shí)現(xiàn)malloc/free, 然后+上HASH LIST 和 鏈表管理。

  回復(fù)  更多評(píng)論   

<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(9)

隨筆分類(67)

隨筆檔案(65)

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情偷拍| 一区二区在线观看av| 在线视频欧美一区| 亚洲精品一区在线| 亚洲三级电影全部在线观看高清| 亚洲欧美日韩国产综合| 亚洲欧美久久久| 欧美一区二区高清在线观看| 久久成人人人人精品欧| 久久久综合免费视频| 久久久亚洲成人| 亚洲观看高清完整版在线观看| 亚洲高清在线播放| 亚洲日本视频| 日韩亚洲在线观看| 亚洲天堂av电影| 欧美一区二区三区免费看| 久久午夜色播影院免费高清| 亚洲高清123| 99国产精品久久久久老师| 午夜精品久久久久久久| 久久躁狠狠躁夜夜爽| 欧美破处大片在线视频| 国产情人节一区| 亚洲日韩中文字幕在线播放| 国产精品99久久久久久久久久久久| 欧美在线精品免播放器视频| 欧美激情一二三区| 亚洲午夜视频在线观看| 久久人人爽人人爽| 国产精品区一区二区三区| 亚洲国产日韩欧美| 欧美在线视频观看免费网站| 亚洲精品影院在线观看| 老司机免费视频久久| 欧美日一区二区三区在线观看国产免| 国产偷自视频区视频一区二区| 亚洲精品护士| 久久综合中文字幕| 亚洲一区二区三区精品在线观看 | 亚洲影院免费| 欧美成人免费一级人片100| 国产欧美日韩精品a在线观看| 亚洲精品在线观| 免费欧美网站| 欧美在线视频一区| 国产精品一区二区三区久久| 中文一区在线| 日韩视频免费大全中文字幕| 欧美不卡一区| 亚洲区第一页| 亚洲国产精品黑人久久久| 久久精品国产一区二区电影 | 亚洲破处大片| 麻豆成人精品| 在线精品观看| 欧美电影资源| 久热精品在线视频| 1000部国产精品成人观看 | 亚洲一区二区三区在线| 欧美日韩一区在线观看视频| 亚洲三级毛片| 亚洲精品乱码久久久久久黑人| 免费成人黄色片| 136国产福利精品导航网址应用| 久久久午夜视频| 久久久久久夜| 亚洲人成在线观看| 亚洲啪啪91| 99热在线精品观看| 欧美午夜精品久久久久久久| 亚洲一区二区日本| 亚洲欧美春色| 激情视频一区二区| 欧美激情精品久久久久久大尺度| 女生裸体视频一区二区三区| 日韩视频免费在线| 一本色道久久综合狠狠躁篇的优点| 欧美精品精品一区| 亚洲欧美日韩一区在线观看| 午夜精品在线视频| 亚洲国产日韩美| 一区二区冒白浆视频| 国产一区二区福利| 亚洲第一区在线观看| 欧美日韩另类丝袜其他| 午夜精品久久久久久久久久久久久 | 午夜精品亚洲| 欧美在线一区二区三区| 91久久国产精品91久久性色| 日韩视频中午一区| 国产亚洲一区二区三区在线播放| 老司机免费视频一区二区| 欧美激情国产日韩精品一区18| 亚洲影院污污.| 久久久夜夜夜| 亚洲一区欧美激情| 久久一区二区三区四区| 亚洲午夜精品一区二区| 久久精品av麻豆的观看方式| 日韩视频免费| 久久精品久久99精品久久| 亚洲天堂av电影| 美女爽到呻吟久久久久| 欧美一区二区三区四区视频| 欧美精品成人| 欧美成人精品1314www| 国产精品人人爽人人做我的可爱 | 欧美在线啊v一区| 日韩一区二区精品视频| 久久久99久久精品女同性| 亚洲一区二区三区在线视频| 久久噜噜亚洲综合| 欧美在线亚洲在线| 国产精品久久久久久亚洲调教| 亚洲国产毛片完整版| 黑丝一区二区三区| 亚洲欧美中文在线视频| 亚洲一区二区欧美| 欧美精品尤物在线| 欧美黑人在线播放| 亚洲电影毛片| 久久精品国产亚洲精品| 欧美一区二区三区四区高清 | 国产欧美91| 夜夜爽av福利精品导航| 欧美日韩国产限制| 欧美国产91| 1000部精品久久久久久久久| 欧美一区二区三区四区高清| 性欧美大战久久久久久久免费观看| 欧美日本精品| 999亚洲国产精| 99在线|亚洲一区二区| 欧美国产免费| 亚洲精选在线观看| 在线亚洲免费视频| 欧美日韩国产综合久久| 日韩视频在线观看一区二区| 亚洲无玛一区| 国产精品网站视频| 欧美一区二区久久久| 久久久青草青青国产亚洲免观| 国产精品亚洲综合| 亚洲欧美www| 久久久久天天天天| 一区免费在线| 免费在线视频一区| 亚洲日本免费电影| 中国成人在线视频| 欧美三日本三级三级在线播放| 在线亚洲美日韩| 欧美尤物一区| 韩国三级电影久久久久久| 久久久噜噜噜久噜久久| 模特精品在线| 亚洲精品之草原avav久久| 欧美国产精品中文字幕| a4yy欧美一区二区三区| 亚洲欧美在线视频观看| 国产亚洲精品v| 玖玖综合伊人| 亚洲精品在线看| 欧美在线视频观看免费网站| 久久精品99无色码中文字幕 | 欧美日韩a区| 亚洲一区二区视频| 麻豆av一区二区三区| 日韩视频免费观看高清完整版| 国产精品扒开腿做爽爽爽视频| 午夜免费在线观看精品视频| 欧美成人免费va影院高清| 亚洲一区二区日本| 亚洲成人直播| 国产精品无码专区在线观看| 欧美~级网站不卡| 亚洲女人天堂成人av在线| 欧美搞黄网站| 久久久999精品视频| 一区二区三区日韩欧美| 国产真实精品久久二三区| 欧美激情在线| 久久精品三级| 亚洲伊人观看| 亚洲精品欧美极品| 免费成人在线视频网站| 午夜亚洲福利| 一区二区三区精品久久久| 激情av一区| 国产精品私人影院| 欧美精品一线| 美女视频黄a大片欧美| 性欧美精品高清| 夜夜爽夜夜爽精品视频| 欧美激情中文不卡| 久久先锋影音| 久久99伊人| 国产欧美欧洲在线观看| 欧美二区在线播放| 久久青青草原一区二区|