• <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那種就沒事了,僅僅是這樣做空間上劃不來而已  回復  更多評論   

            性做久久久久久久久老女人| 97久久精品人妻人人搡人人玩| 热久久这里只有精品| 日韩一区二区三区视频久久| 一本色道久久综合狠狠躁篇 | 老男人久久青草av高清| 青青草国产成人久久91网| 国产精品内射久久久久欢欢| 国产精品久久久香蕉| 狼狼综合久久久久综合网| 亚洲人成无码久久电影网站| 亚洲午夜无码久久久久| 亚洲国产成人精品无码久久久久久综合 | 久久人人爽人人澡人人高潮AV | 人妻少妇精品久久| 久久激情亚洲精品无码?V| 久久综合狠狠色综合伊人| 亚洲欧洲精品成人久久曰影片| 国产成人久久激情91 | 久久久精品2019免费观看| 久久综合久久美利坚合众国| 久久国产一区二区| 国产真实乱对白精彩久久| 伊人热人久久中文字幕| 韩国三级大全久久网站| 亚洲欧美国产精品专区久久| 99精品久久精品| 久久久久亚洲国产| 99久久这里只精品国产免费 | 午夜精品久久久久久| 精品久久久久中文字幕日本| 久久国产精品77777| 亚洲午夜无码久久久久小说 | 99精品国产综合久久久久五月天| 久久国产精品无码网站| 婷婷久久综合九色综合98| 久久发布国产伦子伦精品| 色婷婷综合久久久久中文一区二区| 伊人久久大香线蕉无码麻豆| 中文成人无码精品久久久不卡| 热综合一本伊人久久精品|