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

            麒麟子

            ~~

            導航

            <2013年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            242526272812
            3456789

            統計

            常用鏈接

            留言簿(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

            這個使用非常的正常, 基本上內存池都是這樣的結構。或者為了可讀性使用一個 類似下面的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 小時候可靚了

            不知道還有其它方式么!!  回復  更多評論   

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

            很棒,學習了。

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

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

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

            久久久免费观成人影院| 久久久久久毛片免费播放| AV无码久久久久不卡网站下载| 久久亚洲综合色一区二区三区| 久久久久久久国产免费看| 久久综合给合久久狠狠狠97色69| 色综合久久中文色婷婷| 午夜精品久久影院蜜桃| 久久综合九色综合精品| 一本大道久久香蕉成人网| 日本免费久久久久久久网站| 精品无码久久久久久久动漫| 久久精品九九亚洲精品天堂| 欧洲精品久久久av无码电影 | 2021国内久久精品| 久久精品国产只有精品2020| 久久99热这里只有精品66| 久久精品国产精品亚洲精品| 国产精品久久久久蜜芽| 国产综合精品久久亚洲| 99久久综合狠狠综合久久止| 国产午夜免费高清久久影院| 久久er国产精品免费观看8| 久久精品人成免费| 中文字幕精品久久| 久久综合久久伊人| 国产精品无码久久四虎| 久久久久国产日韩精品网站| 2021精品国产综合久久| 伊人久久大香线蕉综合Av| 久久久婷婷五月亚洲97号色| 国产69精品久久久久观看软件| 久久国产精品无码网站| 久久免费国产精品一区二区| 国产V综合V亚洲欧美久久| 久久亚洲春色中文字幕久久久| 久久久久高潮综合影院| .精品久久久麻豆国产精品| 精品久久久噜噜噜久久久| 久久国产热精品波多野结衣AV| 久久久久久亚洲精品成人|