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

            麒麟子

            ~~

            導(dǎo)航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統(tǒng)計(jì)

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            某內(nèi)存池中的指針用法

            內(nèi)存池實(shí)現(xiàn)有許多種,各有不同的優(yōu)缺點(diǎn)。

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

             

             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        //將當(dāng)前指向空閑內(nèi)存起始地址作為反回地址   
            12        unsigned char* p = mStartPotinter;   
            13        //取出空閑區(qū)域前4字節(jié)的值,賦值給空閑地址   
            14        //因?yàn)榍八淖止?jié)中存放了下一個(gè)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        //預(yù)分配內(nèi)存   
            29        mStartPotinter = new unsigned char[sizeof(T)*AllocSize];   
            30        //構(gòu)造BLOCK之間的關(guān)系    
            31        //每個(gè)BLOCK的前4BYTE存放了下一個(gè)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);//步進(jìn)   
            38            *next = p;//賦值   
            39            next = (unsigned char**)p;//步進(jìn)   
            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博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/wqjqepr/archive/2010/05/03/5552322.aspx

             

             

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

            mStartPotinter作為二維指針的時(shí)候,相當(dāng)于是一系列的unsigned char* [].

            對于第一個(gè) *next 相當(dāng)于(unsigned char*)mStartPointer[0].

            第二個(gè)相當(dāng)于(unsigned char*)mStartPointer[sizeof(T)*1];

            第三個(gè)相當(dāng)于(unsigned char*)mStartPointer[sizeof(T)*2];

            所以,構(gòu)造BLOCK之間關(guān)系的時(shí)候,也可以寫成

             

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

             

             

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

             

             

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

            評論

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

            這個(gè)使用非常的正常, 基本上內(nèi)存池都是這樣的結(jié)構(gòu)。或者為了可讀性使用一個(gè) 類似下面的union 。

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

            指針的強(qiáng)制類型轉(zhuǎn)換和0字節(jié)的數(shù)組在Win32 API中廣泛使用著  回復(fù)  更多評論   

            # re: 某內(nèi)存池中的指針用法 2010-05-04 09:32 小時(shí)候可靚了

            嗯,是的! 謝謝講解!  回復(fù)  更多評論   

            # re: 某內(nèi)存池中的指針用法 2010-05-04 09:33 小時(shí)候可靚了

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

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

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

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

            謝謝講解  回復(fù)  更多評論   

            # re: 某內(nèi)存池中的指針用法 2010-05-04 12:53 小時(shí)候可靚了

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

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

            就是把一整塊內(nèi)存分成多塊,利用未使用位置串聯(lián)下這些塊。很多代碼都會(huì)涉及到這種用法。  回復(fù)  更多評論   

            # re: 某內(nèi)存池中的指針用法 2010-05-04 18:58 小時(shí)候可靚了

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

            # re: 某內(nèi)存池中的指針用法 2010-05-04 18:58 小時(shí)候可靚了

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

            # re: 某內(nèi)存池中的指針用法 2010-05-05 09:32 lymons

            很棒,學(xué)習(xí)了。

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

            # re: 某內(nèi)存池中的指針用法 2010-05-05 13:39 wjn

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

            av无码久久久久不卡免费网站 | 国产精品亚洲美女久久久| 亚洲国产精品人久久| jizzjizz国产精品久久| 精品久久久无码人妻中文字幕豆芽 | 久久精品国产亚洲av麻豆蜜芽| 久久久久久综合一区中文字幕 | 久久精品人妻中文系列| 少妇久久久久久被弄到高潮| 久久伊人影视| 久久精品aⅴ无码中文字字幕不卡| 久久夜色精品国产噜噜亚洲a| 色婷婷久久久SWAG精品| 7777精品伊人久久久大香线蕉| 国产午夜久久影院| 嫩草影院久久国产精品| 久久久久一本毛久久久| 亚洲精品无码久久久久久| 欧美精品一本久久男人的天堂| 久久综合狠狠色综合伊人| 亚州日韩精品专区久久久| 亚洲国产欧美国产综合久久| 久久久久噜噜噜亚洲熟女综合| 色偷偷88欧美精品久久久| 国产∨亚洲V天堂无码久久久 | 中文字幕久久亚洲一区| 久久精品国产久精国产| 7777精品伊人久久久大香线蕉| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 久久精品夜色噜噜亚洲A∨| 欧美va久久久噜噜噜久久| 久久99精品久久久久久野外| 久久久亚洲欧洲日产国码aⅴ | 亚洲中文字幕无码久久精品1| 国产午夜福利精品久久2021| 国内精品人妻无码久久久影院导航| 久久久SS麻豆欧美国产日韩| 久久九九青青国产精品| 欧美亚洲国产精品久久蜜芽| segui久久国产精品| 免费一级做a爰片久久毛片潮|