青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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),所以未實(shí)現(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 今晚打老虎 閱讀(1895) 評論(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)
感謝測試。其實(shí)我還在c++的摸爬滾打中,對性能測試的概念還比較模糊,也沒有學(xué)習(xí)和體驗過系統(tǒng)的測試。希望能得到有關(guān)方面的指教,比如,測試工具需要什么么?參考指標(biāo)有哪些?  回復(fù)  更多評論
  

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区回区在观看免费视频| 国产亚洲一区二区三区| 久久不射2019中文字幕| 一本大道av伊人久久综合| 免费亚洲一区| 久久精品在线视频| 亚洲欧美日本国产专区一区| 亚洲人永久免费| 在线精品亚洲| 国模叶桐国产精品一区| 国产精品区二区三区日本| 欧美激情一区二区三区在线| 久久青草久久| 欧美综合77777色婷婷| 亚洲一区欧美激情| 一本一本久久a久久精品综合麻豆| 亚洲第一黄网| 久久综合久色欧美综合狠狠| 午夜精品福利一区二区蜜股av| 一本一本久久| 亚洲精品中文在线| 亚洲精品免费在线播放| 1024亚洲| 在线观看欧美精品| 黄色一区二区三区四区| 国外成人在线视频| 黑丝一区二区三区| 国产一区二区三区久久| 国产综合色产| 精品不卡一区二区三区| 好看的日韩av电影| 黄色精品免费| 在线播放日韩欧美| 亚洲国产一二三| 亚洲国产综合视频在线观看| 亚洲国产精品免费| 亚洲国产精品尤物yw在线观看| 在线观看国产日韩| 亚洲欧洲另类| 一本大道av伊人久久综合| 99re6热只有精品免费观看| 中文久久精品| 亚洲欧美网站| 久久精品123| 欧美1区2区| 亚洲欧洲精品一区二区三区不卡| 亚洲国产精品成人va在线观看| 亚洲国产一区二区三区高清| 日韩午夜电影在线观看| 亚洲天堂网站在线观看视频| 亚洲欧美日本国产有色| 久久久久久久激情视频| 欧美激情综合五月色丁香| 欧美区一区二| 国产精品美女主播| 狠狠色综合日日| 亚洲欧洲三级| 亚洲一级在线观看| 久久蜜桃资源一区二区老牛| 欧美电影资源| 在线视频日韩精品| 久久久91精品国产一区二区三区 | 这里只有精品丝袜| 欧美一区二区啪啪| 美女91精品| 国产精品成人一区| 伊人成年综合电影网| 日韩天堂在线观看| 欧美怡红院视频| 欧美成va人片在线观看| 一区二区三区日韩精品视频| 欧美在线观看网址综合| 欧美成人在线网站| 国产精品女主播一区二区三区| 一区视频在线| 亚洲欧美变态国产另类| 老**午夜毛片一区二区三区| 亚洲老板91色精品久久| 性欧美videos另类喷潮| 欧美另类99xxxxx| 国产一区自拍视频| 一本色道久久综合狠狠躁篇的优点| 欧美亚洲午夜视频在线观看| 亚洲国产精品第一区二区三区| 亚洲五月六月| 久久综合狠狠综合久久综青草| 国产精品久久久久一区二区三区| 悠悠资源网亚洲青| 欧美亚洲一级| 日韩亚洲成人av在线| 久久久久久国产精品mv| 国产精品免费网站在线观看| 亚洲日本欧美在线| 久久色在线播放| 亚洲一二三级电影| 老色批av在线精品| 国产美女在线精品免费观看| 99视频精品全部免费在线| 久久久青草婷婷精品综合日韩| 在线亚洲高清视频| 欧美国产日本高清在线| 激情国产一区| 久久精品在这里| 亚洲一区精品在线| 欧美日韩亚洲高清一区二区| 亚洲高清久久久| 久久躁日日躁aaaaxxxx| 午夜国产欧美理论在线播放 | 激情综合在线| 欧美影院在线| 亚洲综合视频一区| 国产精品久久久久永久免费观看| 日韩午夜在线播放| 欧美大尺度在线| 久久综合色播五月| 狠狠色2019综合网| 久久黄色级2电影| 亚洲免费网站| 国产精品青草久久久久福利99| 在线中文字幕一区| 亚洲欧洲综合另类| 欧美77777| 亚洲日韩第九十九页| 欧美电影美腿模特1979在线看| 久久精品盗摄| 伊人成综合网伊人222| 麻豆av一区二区三区久久| 久久精品综合| 亚洲大片在线观看| 欧美大片免费观看| 欧美成人精品影院| 一本色道久久综合狠狠躁篇怎么玩 | 一本色道久久综合精品竹菊| 亚洲国产色一区| 欧美国产日本在线| 一区二区三区视频在线看| 一本色道婷婷久久欧美| 欧美日韩在线一二三| 亚洲欧美久久久| 亚洲欧美色婷婷| 韩国一区电影| 欧美国产专区| 欧美裸体一区二区三区| 国产精品99久久99久久久二8| 日韩视频免费在线| 国产精品外国| 久久色中文字幕| 美女精品一区| 一区二区三欧美| 亚洲视频欧洲视频| 国产一区二区三区精品久久久| 麻豆精品网站| 欧美激情一区二区三区成人| 亚洲免费视频观看| 久久精品官网| 一本一本久久| 亚洲欧美视频一区二区三区| 亚洲电影毛片| 99精品视频免费全部在线| 国产欧美在线播放| 欧美成人黑人xx视频免费观看| 欧美日韩国产va另类| 午夜在线a亚洲v天堂网2018| 久久久夜色精品亚洲| 夜夜爽夜夜爽精品视频| 性欧美xxxx大乳国产app| 亚洲国产精品成人精品| 9l国产精品久久久久麻豆| 国产一区二区久久精品| 亚洲黄色免费网站| 国产精品免费一区二区三区在线观看| 久久亚洲图片| 欧美日韩爆操| 久久精品国产综合精品| 欧美国产日韩在线观看| 久久精品青青大伊人av| 欧美激情第8页| 久久久久久久999| 欧美日韩三级视频| 美女脱光内衣内裤视频久久网站| 欧美日韩大片| 免费永久网站黄欧美| 国产精品久久久久久户外露出| 欧美承认网站| 国产日韩亚洲欧美综合| 亚洲国产日韩精品| 国内精品久久久久久影视8 | 午夜一区不卡| 中文在线一区| 免费在线观看精品| 久久不射2019中文字幕| 欧美日韩国产综合网| 裸体素人女欧美日韩| 国产女同一区二区| 一本色道久久加勒比精品| 亚洲第一色在线| 性欧美1819性猛交| 亚洲免费小视频| 欧美日韩国产页| 亚洲国产精品va在线看黑人|