• <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ù)  更多評論   

            久久777国产线看观看精品| 超级97碰碰碰碰久久久久最新| 色欲综合久久躁天天躁| 久久精品成人免费网站| 久久亚洲国产中v天仙www| 99久久久精品免费观看国产| 国产精品99久久99久久久| 青青青国产成人久久111网站| 久久亚洲私人国产精品vA| 久久婷婷色综合一区二区| 国产精品国色综合久久| 久久精品国产WWW456C0M| 国产毛片欧美毛片久久久| 囯产极品美女高潮无套久久久| 亚洲精品无码专区久久久| 国产精品久久亚洲不卡动漫| 久久久久亚洲AV综合波多野结衣| 久久男人Av资源网站无码软件| 久久久久久国产精品无码下载| 国产精品99精品久久免费| 伊色综合久久之综合久久| 色综合久久久久| 久久久婷婷五月亚洲97号色| 香蕉99久久国产综合精品宅男自 | 久久婷婷午色综合夜啪| 久久99国产精一区二区三区| 色综合久久久久综合体桃花网| 亚州日韩精品专区久久久| 久久亚洲精品无码观看不卡| 99久久精品免费| 久久精品免费大片国产大片| 久久97精品久久久久久久不卡| 国产精品久久久久AV福利动漫| 国产成人久久激情91| 精品蜜臀久久久久99网站| 色88久久久久高潮综合影院| 狠狠色噜噜色狠狠狠综合久久 | 中文精品久久久久国产网址| 久久99精品久久久久久动态图| 久久丫精品国产亚洲av不卡| 日韩人妻无码精品久久免费一|