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

內(nèi)存池設(shè)計(jì)


       也許有人會問:內(nèi)存池是什么呢? 主要用來干什么的?
     大家都知道,C++可以使用指針來操作堆內(nèi)存以獲得高效率的內(nèi)存訪問,一般會使用全局new, delete的內(nèi)存管理函數(shù)來申請和分配內(nèi)存,但在大量使用內(nèi)存分配的程序里----比如:網(wǎng)絡(luò)游戲服務(wù)器的消息,每一條消息就分配一塊內(nèi)存,等消息處理完后,又要釋放內(nèi)存,這樣來來回回的new, delete操作,效率會大大折扣,因?yàn)閚ew,delete函數(shù)不可能預(yù)先知道你的對象要分配多大空間,每一個(gè)都要從當(dāng)前的堆中尋找一塊可用的空間來分配一個(gè)對象,最要命的是當(dāng)你delete后,內(nèi)存還要重新整理內(nèi)存塊,這樣頻繁操作將造成低效率結(jié)果。
  于是,一個(gè)新的思想誕生了,如果當(dāng)你滿足以下條件時(shí),你可以使用內(nèi)存池來提高效率:
       (1) 當(dāng)你頻繁地操作一類對象時(shí),即你老是new 和 delete
       (2) 當(dāng)你知道使用一類對象的最大對象數(shù)時(shí)
      你可以使用內(nèi)存池,它是預(yù)先分配一定數(shù)量的一段內(nèi)存空間,這一段空間預(yù)先分配了某類對象的數(shù)量,然后也可以像使用new, delete那樣的方式來管理內(nèi)存,不同在于這一段內(nèi)存空間的管理使用者要調(diào)用內(nèi)存池提供的相應(yīng)函數(shù)(CreateObj, DestoryObj)來操作,而且堆內(nèi)存由CObjectPool來管理。這樣可以獲得高效率的內(nèi)存操作。
  為什么這樣子就可以高效率呢?恐怕你有點(diǎn)質(zhì)疑,人家平常都用new, delete也挺爽的。好了,還是看下面內(nèi)存池的設(shè)計(jì)思路吧!
  一、我們?yōu)榱诉m應(yīng)不同的類對象,我們使用了模板的接口類----CObjectPool
      二、MemPool類,內(nèi)存池的核心類。負(fù)責(zé)內(nèi)存管理, 主要使用的數(shù)據(jù)結(jié)構(gòu)是鏈表結(jié)構(gòu), 結(jié)構(gòu)為: Object|index, Object是某一類對象的數(shù)據(jù), 而index是它在內(nèi)存中的索引號, 這個(gè)很有用, 它是用來維持[已分配列表] 和 [空閑列表] 的地址計(jì)算。注:(它是浪費(fèi)了4個(gè)字節(jié)的空間,但它的功勞大于它的罪過,你說用不用呢?)

    接下來應(yīng)該貼代碼了吧,大家都關(guān)注這個(gè)實(shí)質(zhì)性的東西了!
//============================================================================// FileName  :ObjectPool.h
// CreateDate:2008-02-20
// Author    :chenguihong
// Des       :內(nèi)存池
//-------------------------------------------------------------------------------------

#ifndef __OBJECT_POOL_H__
#define __OBJECT_POOL_H__

#include "MemPool.h"

template <class T>
class CObjectPool
{   
public:
    CObjectPool(int ObjectReserve = 1000):m_MemPool(sizeof(T),ObjectReserve){}
   
 ~CObjectPool()
 {
  m_MemPool.Release();
 }

    T* CreateObj()
 {
  return static_cast<T*>(m_MemPool.Alloc());
 }
   
 void DestoryObj(void*p)
 {
  m_MemPool.DeAlloc(p);
 }

 int Release()
 {
  return m_MemPool.Release(); 
 }

public:
 MemPool m_MemPool;
};

#endif


//-----------------------------------------------------------------------
//======================================================================
// FileName  :MemPool.h
// CreateDate:2008-02-20
// Author    :chenguihong
// Des       :線程安全的內(nèi)存池
//-------------------------------------------------------------------------------------
#ifndef   __MEM_POOL_H__
#define   __MEM_POOL_H__

#include <windows.h>
#include "Mutex.h"

class MemPool
{
   

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//一塊內(nèi)存.內(nèi)存塊的固定大小為 blockSize * blocks.

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public:
    MemPool(size_t block_size, size_t block_reserved);
    bool Init(size_t block_size, size_t block_reserved);
    int Release();

    //----------------------------------------------------
    //查看還有多少空間可以用
    //----------------------------------------------------
    size_t Capacity();

    //----------------------------------------------------
    //分配一個(gè)內(nèi)存和釋放一個(gè)內(nèi)存
    //----------------------------------------------------
    void* Alloc();
    void  DeAlloc(void* p);

    //----------------------------------------------------
    //判斷一個(gè)指針是不是由這個(gè)Pool分配的。
    //----------------------------------------------------
    bool  Is_ptr(void* p);

private:
    size_t      m_blockSize;       //每一個(gè)塊的大小,即FixedAlloctor能分配的大小. 當(dāng)

m_blockSize不能為1.
    size_t      m_blocks;           //每個(gè)MemChunck中,Block的個(gè)數(shù).
    size_t      m_avaliableBlocks; // 內(nèi)存池中,空閑的塊的個(gè)數(shù)

    //內(nèi)存塊的地址
    unsigned char* m_pData;
    //第一個(gè)可用塊,一個(gè)可用塊的大小是由blockSize指定的.
    unsigned long m_firstAvailableBlock;
    unsigned long m_blocksAvailable; //是不是可用的空閑塊
 
 CMutex m_Mutex;
};

#endif


//---------------------------------------------------------------------------------------

/*
MemPool.cpp
*/

#include "MemPool.h"
#include <cassert>
#include <tchar.h>

#include <iostream>
using namespace std;

/********************************************************
內(nèi)存池分配器.也就是一個(gè)固定大小的內(nèi)存分配器.
Object|index 結(jié)構(gòu)
*********************************************************/

MemPool::MemPool(size_t block_size, size_t block_reserved)
{
 m_pData = NULL;
 m_avaliableBlocks = 0;

    Init(block_size,block_reserved);
}

bool MemPool::Init(size_t blockSize, size_t blocks)
{
    assert(blockSize > 0);
    assert(blocks > 0 && blocks < 10000000); //暫定10000000個(gè),應(yīng)該足夠了吧!

    m_pData = (unsigned char*) malloc((blockSize + sizeof(unsigned long)) * blocks);

 if(m_pData == NULL)
        return false;

    m_firstAvailableBlock = 0;
 m_blocks = blocks;
    m_blocksAvailable = blocks;
 m_blockSize = blockSize;

 
    //填充內(nèi)存塊的鏈
    unsigned long i = 0;
    unsigned char* p = m_pData;
 unsigned long* pNext = NULL;

 for (; i != blocks; p += (blockSize + sizeof(unsigned long)))
    {
        pNext = (unsigned long*) (p + blockSize); //200000個(gè)整型溢出啊,加大馬力
  *pNext = ++i;
    }

 return true;
}

int MemPool::Release()
{
 //請確保調(diào)用者釋放指針方能執(zhí)行操作
 if(m_blocksAvailable < m_blocks)  //出錯(cuò)說明有內(nèi)存申請了但還沒有被釋放
 {
  int Result = m_blocks - m_blocksAvailable;
  return Result; 
 }
 
 if(m_pData != NULL)
 {
  free((unsigned char*)m_pData);
  m_pData = NULL;
  return 0;
 }
}

 

void* MemPool::Alloc()
{
 //多線程訪問要加鎖, 也可以用守衛(wèi)來自動完成(線程安全)
 Mutex_Guard sc(&m_Mutex);
 unsigned char* pResult = NULL;

 if(m_blocksAvailable > 0)
 {
  //把第一個(gè)可用返回給用戶
  //cout<<"申請到第"<<m_firstAvailableBlock+1<<"塊"<<endl;
  pResult = m_pData + (m_firstAvailableBlock * (m_blockSize + sizeof(unsigned

long)));
  m_firstAvailableBlock = *(unsigned long*)(pResult + m_blockSize);
  memset(pResult, 0, m_blockSize); //清0
  m_blocksAvailable--;
 }
 else
 {
  return pResult;
 }
  
   
 return pResult;
}

void  MemPool::DeAlloc(void* p)
{
 //多線程訪問要加鎖, 用守衛(wèi)來自動完成(線程安全)
 Mutex_Guard sc(&m_Mutex);

 assert(Is_ptr(p)); //檢查是不是非法指針

 unsigned char* toRelease = static_cast<unsigned char*>(p);

 //把釋放掉的塊加入到表頭里.新建一個(gè)表頭,表頭下一個(gè)塊指向原來的第一個(gè)可用塊
 * ((unsigned long*)(toRelease + m_blockSize)) = m_firstAvailableBlock;
 //第一個(gè)可用塊指向表頭
 m_firstAvailableBlock = (toRelease - m_pData) / (m_blockSize + sizeof(unsigned

long));
 //塊對齊檢查
 assert(m_firstAvailableBlock == (toRelease - m_pData) / (m_blockSize + sizeof

(unsigned long)));

 m_blocksAvailable++;

 //cout<<"釋放掉第"<<m_firstAvailableBlock+1<<"塊"<<endl;
}


bool MemPool::Is_ptr(void* p)
{
 //內(nèi)存不在這個(gè)里面。也不是他分配的。
    if(p < m_pData  || p > (m_pData + (m_blockSize + sizeof(unsigned long)) * (m_blocks-1)))
  return false;

    //指針沒在blockSize邊界上對齊.肯定不是由這個(gè)MemPool分配的
    long result = ((unsigned char*)p - m_pData) % (m_blockSize + sizeof(unsigned long));
 if(result != 0)
  return false;
   
 return true;
}

//----------------------------------------------------
//查看還有多少空間可以用
//----------------------------------------------------
size_t MemPool::Capacity()
{
    return m_blocksAvailable;
}

使用方法:  CObjectPool<int> m_ObjectPool(10000); //10000個(gè)對象
                   int *p =  m_ObjectPool.CreateObj();  //相當(dāng)于new
                   m_ObjectPool.DestoryObj(p);            //相當(dāng)于delete

好了,代碼到些結(jié)束,該出測試報(bào)告了吧!

性能測試, 當(dāng)當(dāng)當(dāng)當(dāng).....

與普通的系統(tǒng)函數(shù)new和delete作對比, 各自開10條線程進(jìn)行內(nèi)存申請1,000,000對象, 每條線程反復(fù)地進(jìn)

行申請和釋放。

在CPU:Pentium D 3.0G, 內(nèi)存1G的情況下:
結(jié)果: (1) 采用內(nèi)存池用時(shí):        5328ms
      (2) 采用new 和 delete用時(shí):27078ms

如果程序中有什么BUG或有什么看法的話,歡迎留言/評論,謝謝!

 

posted on 2008-04-16 09:01 RedLight 閱讀(1983) 評論(3)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)服務(wù)器開發(fā)

評論

# re: 內(nèi)存池設(shè)計(jì)[未登錄] 2008-11-18 04:35 張帥

設(shè)計(jì)的挺好的,學(xué)到了,謝謝  回復(fù)  更多評論   

# re: 內(nèi)存池設(shè)計(jì) 2012-10-13 02:08 Alven

你這個(gè)只支持按堆的順序DeAlloc吧....用多線程可以么?  回復(fù)  更多評論   

# re: 內(nèi)存池設(shè)計(jì)[未登錄] 2014-04-02 08:52 路人甲

你這遠(yuǎn)遠(yuǎn)不到內(nèi)存池的概念吧!  回復(fù)  更多評論   

<2014年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

導(dǎo)航

統(tǒng)計(jì)

公告


Name: Galen
QQ: 88104725

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

相冊

My Friend

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品高清网站| 亚洲电影中文字幕| 国内激情久久| 国产精品爱久久久久久久| 欧美喷水视频| 国产精品大片| 国产精品一区二区三区四区| 国产精品久久影院| 国产深夜精品| 影音先锋中文字幕一区二区| 亚洲国产精品成人综合色在线婷婷| 国产一区二区三区不卡在线观看 | 久久成人国产精品| 亚洲直播在线一区| 亚洲视频一二区| 一区二区三区高清在线| 欧美韩国日本一区| 亚洲在线观看| 午夜在线视频一区二区区别 | 国产欧美一区二区精品婷婷| 欧美视频在线观看视频极品| 欧美三级视频| 国产欧美一级| 亚洲国产精品视频| 亚洲精选中文字幕| 久久av一区二区| 欧美激情国产精品| 日韩午夜激情| 久久在线观看视频| 国产精品一区二区久久久| 亚洲人成网站影音先锋播放| 欧美激情91| 亚洲日本激情| 亚洲日韩第九十九页| 亚洲一区二区三区视频| 欧美日韩ab| 亚洲香蕉在线观看| 亚洲午夜久久久| 国产精品欧美久久| 欧美与欧洲交xxxx免费观看| 亚洲一区三区在线观看| 欧美精品久久久久久久久久| 最新中文字幕亚洲| 欧美mv日韩mv国产网站| 欧美高清日韩| 亚洲欧美影音先锋| 久久国产精品72免费观看| 国产一级久久| 欧美超级免费视 在线| 免费在线成人| 欧美中文字幕| 欧美日韩一区二区国产| 欧美日韩一区二区三区免费看 | 亚洲国产美女精品久久久久∴| 艳妇臀荡乳欲伦亚洲一区| 亚洲激情自拍| 欧美日韩成人在线播放| 欧美高清成人| 亚洲春色另类小说| 亚洲欧美www| 在线中文字幕日韩| 欧美激情在线有限公司| 免费成人黄色| 伊人精品成人久久综合软件| 亚洲天堂av在线免费观看| 久久国产精品久久w女人spa| 日韩亚洲一区在线播放| 久久久久久久久蜜桃| 亚洲在线视频免费观看| 欧美金8天国| 91久久精品国产91久久性色tv | 亚洲视频一区在线观看| 亚洲精品欧洲精品| 久久综合中文字幕| 亚洲国产精品第一区二区| 亚洲国产精品电影| 美女视频网站黄色亚洲| 欧美黄色免费网站| 日韩网站免费观看| 欧美午夜精品久久久| 一区二区三区视频在线| 亚洲一区视频| 国产精品亚洲综合色区韩国| 宅男噜噜噜66一区二区| 性欧美暴力猛交另类hd| 国产伦精品一区二区三区视频孕妇| 日韩午夜av电影| 亚洲欧美日韩直播| 伊人色综合久久天天| 久久香蕉国产线看观看av| 美日韩精品视频免费看| 亚洲美女在线国产| 国产欧美一区二区精品秋霞影院| 久久手机免费观看| 日韩视频在线免费| 欧美在线一级视频| 在线看一区二区| 国产精品羞羞答答xxdd| 欧美va天堂va视频va在线| 亚洲欧美激情视频| 一区二区三区欧美| 亚洲国产成人一区| 国产精品久久久久免费a∨| 一本一道久久综合狠狠老精东影业 | 欧美黄色网络| 性一交一乱一区二区洋洋av| 亚洲欧洲日本一区二区三区| 午夜精品视频在线| 亚洲视频精选在线| 亚洲精品日韩欧美| 亚洲区中文字幕| 亚洲欧洲综合另类| 91久久午夜| 一区二区三区**美女毛片| 激情成人在线视频| 国产午夜精品全部视频播放 | 欧美黄色一级视频| 欧美二区视频| 欧美激情一区二区久久久| 麻豆精品视频在线观看视频| 欧美一区二区三区久久精品茉莉花 | 欧美一区二粉嫩精品国产一线天| 99re这里只有精品6| 亚洲国产精品一区二区www在线| 亚洲电影下载| 99国产一区| 午夜精品久久久久久久| 香蕉国产精品偷在线观看不卡| 午夜欧美大尺度福利影院在线看| 久久精品一区二区三区四区| 国产一区二区三区的电影| 激情久久综艺| 一本色道久久综合亚洲精品按摩| 一本色道久久综合亚洲精品不| 亚洲免费人成在线视频观看| 久久婷婷丁香| 99在线精品视频在线观看| 欧美成人福利视频| 国产欧美日韩视频一区二区| 亚洲人成在线观看一区二区| 亚洲一区久久久| 亚洲国产精品va在线观看黑人| 亚洲天堂免费观看| 欧美大片第1页| 亚洲国产三级网| 免费成人性网站| 久久综合一区| 亚洲福利视频网站| 欧美福利一区二区| 欧美激情国产精品| 在线视频亚洲一区| 亚洲永久免费| 国产视频亚洲精品| 久久综合给合| 欧美gay视频| 亚洲欧美不卡| 欧美亚洲一区二区在线| 国产午夜精品全部视频在线播放| 久久久欧美精品| 女生裸体视频一区二区三区| 亚洲欧美日韩国产精品| 这里只有视频精品| 亚洲欧美网站| 久久亚洲春色中文字幕| 久久久久国产精品麻豆ai换脸| 亚洲精品日产精品乱码不卡| 麻豆精品传媒视频| 亚洲丁香婷深爱综合| 亚洲人成网在线播放| 欧美精品少妇一区二区三区| 欧美高清视频在线观看| 国产欧美精品日韩| 亚洲桃色在线一区| 亚洲欧美一区二区原创| 国产精品vip| 99国产精品久久久| 午夜精品亚洲| 一本色道久久综合亚洲精品不卡| 亚洲欧美不卡| 亚洲欧美日韩在线| 国产精品色网| 午夜免费在线观看精品视频| 亚洲最新视频在线播放| 欧美jizz19hd性欧美| 欧美第一黄色网| 亚洲国产高清自拍| 欧美久久一级| 正在播放亚洲一区| 夜夜精品视频一区二区| 欧美岛国激情| 日韩视频免费观看| 亚洲一区国产视频| 国内精品伊人久久久久av一坑| 麻豆精品视频| 亚洲欧美久久| 亚洲精品国产品国语在线app| 午夜激情综合网| 欧美连裤袜在线视频| 亚洲一区二区三区激情| 亚洲高清久久久|