• <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>

            麒麟子

            ~~

            導航

            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統計

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            某內存池中的指針用法

            內存池實現有許多種,各有不同的優缺點。

            這里不是主要說內存池,只是覺得這個內存池中的指針用得很飄逸!

             

             1template <class T,int AllocSize = 50>   
             2class MemPool   
             3{   
             4public:   
             5    static void* operator new(size_t allocLength)   
             6    {   
             7        if(!mStartPotinter)   
             8        {   
             9            MyAlloc();   
            10        }
               
            11        //將當前指向空閑內存起始地址作為反回地址   
            12        unsigned char* p = mStartPotinter;   
            13        //取出空閑區域前4字節的值,賦值給空閑地址   
            14        //因為前四字節中存放了下一個BLOCK的地址   
            15        mStartPotinter = *(unsigned char**)mStartPotinter;   
            16        return p;   
            17    }
               
            18  
            19    static void operator delete(void* deleteP)   
            20    {   
            21//      assert(deletePointer);   
            22        *(unsigned char**)deleteP = mStartPotinter;   
            23        mStartPotinter = (unsigned char*)deleteP;   
            24    }
               
            25  
            26    static void MyAlloc()   
            27    {   
            28        //預分配內存   
            29        mStartPotinter = new unsigned char[sizeof(T)*AllocSize];   
            30        //構造BLOCK之間的關系    
            31        //每個BLOCK的前4BYTE存放了下一個BLOCK的地址   
            32        unsigned char** next = (unsigned char**)mStartPotinter;   
            33        unsigned char* p = mStartPotinter;   
            34  
            35        for(int i = 0; i< AllocSize;++i)   
            36        {   
            37            p +=sizeof(T);//步進   
            38            *next = p;//賦值   
            39            next = (unsigned char**)p;//步進   
            40        }
               
            41        *next = NULL;   
            42    }
               
            43  
            44    static unsigned char* mStartPotinter;   
            45}
            ;   
            46  
            47template <class T,int AllocSize>   
            48unsigned char* MemPool<T,AllocSize>::mStartPotinter = NULL;  
            49
            50
            51本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wqjqepr/archive/2010/05/03/5552322.aspx

             

             

            簡單提示一下: unsigned char** next = (unsigned char**)mStartPotinter;

            mStartPotinter作為二維指針的時候,相當于是一系列的unsigned char* [].

            對于第一個 *next 相當于(unsigned char*)mStartPointer[0].

            第二個相當于(unsigned char*)mStartPointer[sizeof(T)*1];

            第三個相當于(unsigned char*)mStartPointer[sizeof(T)*2];

            所以,構造BLOCK之間關系的時候,也可以寫成

             

            1for(int i = 0; i< AllocSize;++i)   
            2{   
            3 p +=sizeof(T);//步進   
            4 unsigned char* pp = (unsigned char*)(p[sizeof(T)*i]);   
            5 pp = p;//賦值   
            6}
             

             

             

            不想多解釋了,累。估計多看幾分種啥都明白了!

             

             

            posted on 2010-05-03 18:33 麒麟子 閱讀(1957) 評論(11)  編輯 收藏 引用 所屬分類: Programming

            評論

            # re: 某內存池中的指針用法 2010-05-04 09:02 jmchxy

            這個使用非常的正常, 基本上內存池都是這樣的結構?;蛘邽榱丝勺x性使用一個 類似下面的union 。

            union BLOCK
            {
            BLOCK* next;
            unsigned char data[BLOCKSIZE];
            };

            指針的強制類型轉換和0字節的數組在Win32 API中廣泛使用著  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 09:32 小時候可靚了

            嗯,是的! 謝謝講解!  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 09:33 小時候可靚了

            @jmchxy
            這樣行么?
            union BLOCK
            {
            unsigned char* next;
            unsigned char data[BLOCKSIZE];
            };  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 10:55 zuhd

            @小時候可靚了
            我個人覺得
            union BLOCK
            {
            DWORD next;
            unsigned char data[BLOCKSIZE];
            };
            這樣寫都行,只要能把這個指針的地址保存到 data的前4個字節,后面自己做強制轉換就好了,不過BLOCK* next這樣的格式是科學的,用void* 或DWORD來聲明指針,然后用*(T*)這樣的格式去取,就太不和諧了
              回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 11:33 麗可酷

            謝謝講解  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 12:53 小時候可靚了

            @zuhd
            嗯,謝謝,我早上腦殘了。哈哈  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 17:44 Kevin Lynx

            就是把一整塊內存分成多塊,利用未使用位置串聯下這些塊。很多代碼都會涉及到這種用法。  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 18:58 小時候可靚了

            @Kevin Lynx
            嗯,就是這樣的!!!  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-04 18:58 小時候可靚了

            不知道還有其它方式么?。?nbsp; 回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-05 09:32 lymons

            很棒,學習了。

            不過,這對單個block的分配是個很好的解決方案,
            但是要是分配多個block呢?
            在重載delete操作符的函數中,是沒有辦法知道要本次要刪除的內存
            到底有多少個塊,也就沒有辦法維護這些block中的地址表。當然,
            除非把block數作為參數傳進去,但這樣的話,就造成了用戶
            的麻煩,用戶在刪除分配給自己的內存的時候還必須記得這塊內存里
            的block的數目,萬一寫錯了,后果不堪設想。  回復  更多評論   

            # re: 某內存池中的指針用法 2010-05-05 13:39 wjn

            我覺得這種方法有一個限制:sizeof(T) >= sizeof(指針)
            用union那種就沒事了,僅僅是這樣做空間上劃不來而已  回復  更多評論   

            日本久久久精品中文字幕| 99久久国产综合精品五月天喷水| 综合久久一区二区三区| 久久久无码精品亚洲日韩京东传媒 | 精品国产乱码久久久久久人妻| 一本一本久久A久久综合精品 | 国产日韩久久久精品影院首页| 欧美一级久久久久久久大片 | 国产精品永久久久久久久久久| 欧美一级久久久久久久大片| 97热久久免费频精品99| 麻豆精品久久久久久久99蜜桃 | 日产精品久久久一区二区| 亚洲国产精品热久久| 狠狠色综合网站久久久久久久高清| 1000部精品久久久久久久久| 日日狠狠久久偷偷色综合免费 | 国产精品久久久99| 精品国产乱码久久久久软件| 久久无码人妻精品一区二区三区 | 成人综合伊人五月婷久久| 色偷偷88欧美精品久久久| 久久久久久综合一区中文字幕| 久久精品国产亚洲AV香蕉| 国内精品久久久久久久涩爱| 久久精品国产第一区二区三区| 久久久久久久精品成人热色戒 | 久久久久久久国产免费看| 久久91亚洲人成电影网站| 亚洲午夜久久久久妓女影院 | 色综合久久天天综合| 91久久精一区二区三区大全| 欧洲成人午夜精品无码区久久| 欧美久久综合九色综合| 久久久久噜噜噜亚洲熟女综合| 国产高清美女一级a毛片久久w | 精品无码久久久久国产动漫3d| 日韩十八禁一区二区久久| 久久久久亚洲av成人网人人软件| 久久免费视频1| 伊人久久综合无码成人网|