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

            5D空間

            學(xué)習(xí)總結(jié)與經(jīng)驗交流

               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              對象池的指針版本。池中本質(zhì)上是一群對象,只構(gòu)造一次,返回指針。主要支持頻繁重建的內(nèi)存空間不連續(xù)的自建結(jié)構(gòu),如樹,鏈表。
            /******************************************************************
             *名稱:PointerPool(指針池)(模板)
             *版本號:0.1
             *作者:趙耀(中山大學(xué)2010級)
             *時間:2011.4.11
             *簡介:
             *        對應(yīng)于對象池,這是一個指針池,用于緩存頻繁調(diào)用的指針(對象).主要支
             *    持頻繁重建的樹或鏈表等結(jié)構(gòu).具有默認(rèn)構(gòu)造函數(shù)接收一個size_t對象表明指針
             *    分塊的大小,默認(rèn)為10.接收的參數(shù)如果<=0則會拋出異常invalid_argument.
             *    public方法:
             *        T* getPointer(); 從池中返回一個該類型對象的指針;
             *        void recyclePointer( T* ); 接受需要回收的指針;
             *        void clear(); 清空池以釋放占用的內(nèi)存;
             *        bool empty(); 返回池是否為空;
             *        size_t size(); 返回池中總指針數(shù)量;
             *        size_t remain(); 返回指針池剩余可用指針的數(shù)量;
             *    注意:
             *        使用方法可簡單地想成通過兩個成員函數(shù)來代替new和delete.必須確保分
             *    配的指針得到回收!必須確保回收的指針不是外來指針!因為未進(jìn)行二次初始化,
             *    重新分配得到的指針?biāo)笇ο罂赡苁巧弦淮问褂煤蟮臍堄鄬ο?請進(jìn)行必要的初
             *    話工作.
             *
             *未完成特性:
             *        因為主要支持樹,鏈表等內(nèi)存空間不連續(xù)的結(jié)構(gòu),所以未實現(xiàn)成數(shù)組規(guī)模
             *    地分配指針的功能.
             *
             *已知bug:暫無
             *
             *版權(quán)信息:
             *        該代碼為開源代碼,原作者保留其所有權(quán).你可以拷貝,修改,使用該代碼,但
             *    是請保留必要的版權(quán)信息.
            *****************************************************************
            */

            #ifndef POINTERPOOL_H
            #define POINTERPOOL_H

            #include 
            <vector>
            #include 
            <queue>
            #include 
            <stdexcept>
            #include 
            <memory>
            using namespace std;

            template
            < typename T >
            class PointerPool
            {
            public:
                
            //Create a PointerPool to contain size pointers.
                PointerPool( size_t size = kDefaultChunkSize )
                    
            throw ( invalid_argument, bad_alloc );
                
            ~PointerPool();

                
            //Return a specific pointer to client.
                T *getPointer();
                
            //Recycle the pointer that the client doesn't need any more.
                void recyclePointer( T* );
                
            //Clear the pool and release the memory.
                void clear();
                
            bool empty();
                
            //Return the total number of pointers the pool contains.
                size_t size();
                
            //Return the number of pointers remain available.
                size_t remain();

            protected:
                queue
            < T* > mFreeList;
                vector
            < T* > mAllpointers;//A record of all pointers which help
                
            //to destroy them.

                size_t mChunkSize;
                
            static const size_t kDefaultChunkSize = 10;

                
            //Allocate mChunkSize new pointers and add them to the
                
            //mFreeList.
                void allocateChunk();
                
            //help the destructor the delete the pointers int the pool.
                static void deleteHelper( T* );

            private:
                
            //Hide the copy constructor and assignment symbol.
                PointerPool( const PointerPool< T > & );
                PointerPool
            < T > &operator=const PointerPool< T > & );
            }
            ;

            template
            < typename T >
            size_t PointerPool
            <T>::remain()
            {
                
            return mFreeList.size();
            }


            template
            < typename T >
            bool PointerPool<T>::empty()
            {
                
            return remain() == 0;
            }


            template
            < typename T >
            size_t PointerPool
            <T>::size()
            {
                
            return mChunkSize * mAllpointers.size();
            }


            template
            < typename T >
            PointerPool
            <T>::PointerPool( size_t size /*= kDefaultChunkSize */ ) throw ( invalid_argument, bad_alloc )
            {
                
            if ( size <= 0 )
                    
            throw invalid_argument( "chunk size must be positive" );

                mChunkSize 
            = size;
                allocateChunk();
            }


            template
            < typename T >
            *PointerPool<T>::getPointer()
            {
                
            if ( mFreeList.empty() )
                    allocateChunk();

                T 
            *ptr = mFreeList.front();
                mFreeList.pop();
                
            return ptr;
            }


            template
            < typename T >
            void PointerPool<T>::clear()
            {
                for_each( mAllpointers.begin(), mAllpointers.end(), deleteHelper );

                mAllpointers.clear();
                
            while ( !mFreeList.empty() )
                    mFreeList.pop();
            }


            template
            < typename T >
            void PointerPool<T>::recyclePointer( T *ptr )
            {
                mFreeList.push( ptr );
            }


            template
            < typename T >
            void PointerPool<T>::allocateChunk()
            {
                T
            * newPointerChunk = new T[ mChunkSize ];

                mAllpointers.push_back( newPointerChunk );
                
            for ( int i = 0; i < mChunkSize; i++ )
                
            {
                    mFreeList.push( 
            &newPointerChunk[i] );
                }

            }


            template
            < typename T >
            void PointerPool<T>::deleteHelper( T *pointerChunk )
            {
                delete [] pointerChunk;
            }


            template
            < typename T >
            PointerPool
            <T>::~PointerPool()
            {
                for_each( mAllpointers.begin(), mAllpointers.end(), deleteHelper );
            }


            #endif

            以下為測試代碼:
            #include "PointerPool.h"
            #include 
            <iostream>
            using namespace std;

            class ListNode
            {
            public:
                
            int value;
                ListNode 
            *nextPtr;

                ListNode() : value(
            0), nextPtr(0)
                
            {}
            }
            ;

            int growing()
            {
                
            static int numGrouwing = 0;
                
            return numGrouwing++;
            }


            int main()
            {
                
            const int cases = 2;
                PointerPool
            < ListNode > lnPool;

                
            //Make 2 tests.
                for ( int i = 0; i < cases; i++ )
                
            {
                    
            if ( lnPool.empty() )
                        cout 
            << "The pool is empty!" << endl;
                    
            else
                        cout 
            << "The pool has " << lnPool.remain()
                        
            << " pointers available" << endl;

                    
            //Create the head of a list.
                    ListNode *start = lnPool.getPointer();
                    start
            ->value = growing();
                    ListNode 
            *last = start;

                    
            //Complete the list with length of 100.
                    for ( int j = 1; j < 100; j++ )
                    
            {
                        ListNode 
            *tmp = lnPool.getPointer();
                        tmp
            ->value = growing();
                        last
            ->nextPtr = tmp;
                        last 
            = tmp;
                    }


                    
            //Travel and cout the value of each node.
                    ListNode *current = start;
                    
            while ( current != 0 )
                    
            {
                        cout 
            << current->value << '\t';
                        current 
            = current->nextPtr;
                    }


                    
            //Recycle all pointers back to the pool.
                    while ( start != 0 )
                    
            {
                        current 
            = start;
                        start 
            = start->nextPtr;
                        lnPool.recyclePointer( current );
                    }


                    cout 
            << "The pool has " << lnPool.size() << " pointers"
                        
            << "\n\n";
                    
            //Try clear the pool
                    lnPool.clear();
                }

            }
            posted on 2011-04-11 16:13 今晚打老虎 閱讀(1857) 評論(5)  編輯 收藏 引用 所屬分類: 我的開源庫

            評論

            # re: PointerPool(指針池) 2011-04-11 18:26 ooseven
            本質(zhì)上就是一個ptrvector吧?  回復(fù)  更多評論
              

            # re: PointerPool(指針池) 2011-04-11 18:49 bennycen
            。。。。。。。。。  回復(fù)  更多評論
              

            # re: PointerPool(指針池) 2011-04-11 20:42 千暮(zblc)
            測試了下,如果把鏈表長度改為1w,kDefaultChunkSize長度改為100,注釋掉所有輸出,cases改為2w 比不用你的指針池而直接new快4-5倍.

              回復(fù)  更多評論
              

            # re: PointerPool(指針池) 2011-04-12 00:19 今晚打老虎
            @千暮(zblc)
            感謝測試。其實我還在c++的摸爬滾打中,對性能測試的概念還比較模糊,也沒有學(xué)習(xí)和體驗過系統(tǒng)的測試。希望能得到有關(guān)方面的指教,比如,測試工具需要什么么?參考指標(biāo)有哪些?  回復(fù)  更多評論
              

            # re: PointerPool(指針池) 2011-04-12 00:46 千暮(zblc)
            @今晚打老虎
            其實不用考慮得太復(fù)雜 就是計算時間(在代碼中插入時鐘計算間隔)、空間消耗(重載分配堆內(nèi)存的內(nèi)置函數(shù))和運(yùn)行效率的穩(wěn)定性(代碼運(yùn)行的邊界情況進(jìn)行分析)。至于系統(tǒng)測試,也只是把情況劃分得更加細(xì)致而已。  回復(fù)  更多評論
              

            天天躁日日躁狠狠久久| 国产精品内射久久久久欢欢| 久久综合88熟人妻| 一级做a爰片久久毛片人呢| 久久一区二区免费播放| 欧洲成人午夜精品无码区久久| 久久这里只有精品久久| 无码国内精品久久人妻麻豆按摩| 精品国产VA久久久久久久冰 | 久久无码av三级| 久久综合色区| 狠狠久久亚洲欧美专区| 无码任你躁久久久久久| 久久久精品免费国产四虎| 日韩AV毛片精品久久久| 99久久99久久精品免费看蜜桃| 一本色道久久88综合日韩精品 | 亚洲日韩中文无码久久| 精品久久香蕉国产线看观看亚洲| 内射无码专区久久亚洲| 久久99国产精品99久久| 久久AV高潮AV无码AV| 久久久精品日本一区二区三区| 久久精品国产亚洲AV无码偷窥 | 久久99精品久久久久久动态图 | 久久一区二区三区99| 97精品国产97久久久久久免费| 亚洲精品无码久久久久sm| 亚洲性久久久影院| 国産精品久久久久久久| 色综合久久最新中文字幕| 久久久久亚洲AV无码麻豆| 亚洲色大成网站WWW久久九九| 亚洲va久久久久| 亚洲精品97久久中文字幕无码| 国内精品久久久久久久coent| 四虎国产永久免费久久| 欧美综合天天夜夜久久| 91久久精品电影| 国产高潮久久免费观看| 国产精品成人99久久久久91gav|