日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个高效的内存池实现

發(fā)布時間:2025/6/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个高效的内存池实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在高效C++編程中看到一個不錯的內存池實現(xiàn)方案,這里共享下,大家看看有什么不足。
代碼很簡單,如下:

template<typename?T>
class?CMemoryPool
{
????public:
????????enum?{?EXPANSION_SIZE?=?32};

????????CMemoryPool(unsigned?int?nItemCount?=?EXPANSION_SIZE)
????????{
????????????ExpandFreeList(nItemCount);
????????}
????????
????????~CMemoryPool()
????????{
????????????//free?all?memory?in?the?list
????????????CMemoryPool<T>*?pNext?=?NULL;
????????????for(pNext?=?m_pFreeList;?pNext?!=?NULL;?pNext?=?m_pFreeList)
????????????{
????????????????m_pFreeList?=?m_pFreeList->m_pFreeList;
????????????????delete?[](char*)pNext;
????????????}
????????}

????????void*?Alloc(unsigned?int?/*size*/)
????????{
????????????if(m_pFreeList?==?NULL)
????????????{
????????????????ExpandFreeList();
????????????}
????????????
????????????//get?free?memory?from?head
????????????CMemoryPool<T>*?pHead?=?m_pFreeList;
????????????m_pFreeList?=?m_pFreeList->m_pFreeList;
????????????return?pHead;
????????}

????????void?Free(void*?p)
????????{
????????????//push?the?free?memory?back?to?list
????????????CMemoryPool<T>*?pHead?=?static_cast<CMemoryPool<T>*>(p);
????????????pHead->m_pFreeList?=?m_pFreeList;
????????????m_pFreeList?=?pHead;
????????}

????protected:
????????//allocate?memory?and?push?to?the?list
????????void?ExpandFreeList(unsigned?nItemCount?=?EXPANSION_SIZE)
????????{
????????????unsigned?int?nSize?=?sizeof(T)?>?sizeof(CMemoryPool<T>*)???sizeof(T)?:?sizeof(CMemoryPool<T>*);
????????????CMemoryPool<T>*?pLastItem?=?static_cast<CMemoryPool<T>*>(static_cast<void*>(new?char[nSize]));
????????????m_pFreeList?=?pLastItem;
????????????for(int?i=0;?i<nItemCount-1;?++i)
????????????{
????????????????pLastItem->m_pFreeList?=?static_cast<CMemoryPool<T>*>(static_cast<void*>(new?char[nSize]));
????????????????pLastItem?=?pLastItem->m_pFreeList;
????????????}

????????????pLastItem->m_pFreeList?=?NULL;
????????}

????private:
????????CMemoryPool<T>*?m_pFreeList;
};


它的實現(xiàn)思想就是每次從List的頭上取內存, 如果取不到則重新分配一定數(shù)量; 用完后把內存放回List頭部,這樣的話效率很高,因為每次List上可以取到的話,肯定是空閑的內存。

當然上面的代碼只是針對單線程的,要支持多線程的話也很簡單,外面加一層就可以了,
代碼如下:

class?CCriticalSection
{
public:
????CCriticalSection()
????{
????????InitializeCriticalSection(&m_cs);
????}

????~CCriticalSection()
????{
????????DeleteCriticalSection(&m_cs);
????}

????void?Lock()
????{
????????EnterCriticalSection(&m_cs);?
????}

????void?Unlock()
????{
????????LeaveCriticalSection(&m_cs);
????}

protected:
????CRITICAL_SECTION?m_cs;
};

template<typename?POOLTYPE,?typename?LOCKTYPE>
class?CMTMemoryPool
{
????public:
????????void*?Alloc(unsigned?int?size)
????????{
????????????void*?p?=?NULL;
????????????m_lock.Lock();
????????????p?=?m_pool.Alloc(size);
????????????m_lock.Unlock();

????????????return?p;
????????}

????????void?Free(void*?p)
????????{
????????????m_lock.Lock();
????????????m_pool.Free(p);
????????????m_lock.Unlock();????
????????}

????private:
????????POOLTYPE?m_pool;
????????LOCKTYPE?m_lock;
};


這是我的測試代碼:

#include?<iostream>
#include?<windows.h>

using?namespace?std;

#include?"MemoryPool.h"
#include?"MTMemoryPool.h"

class?CTest
{
public:
????int?m_n;
????int?m_n1;

????void*?operator?new(size_t?size)
????{
????????void*?p?=?s_pool->Alloc(size);
????????return?p;
????}

????void?operator?delete(void*?p,?size_t?size)
????{
????????s_pool->Free(p);
????}

????static?void?NewPool()
????{
????????//s_pool?=?new?CMemoryPool<CTest>;
????????s_pool?=?new?CMTMemoryPool<CMemoryPool<CTest>,?CCriticalSection>;
????}

????static?void?DeletePool()
????{
????????delete?s_pool;
????????s_pool?=?NULL;
????}
????
????//static?CMemoryPool<CTest>*?s_pool;
????static?CMTMemoryPool<CMemoryPool<CTest>,?CCriticalSection>*?s_pool;
};

//CMemoryPool<CTest>*?CTest::s_pool?=?NULL;
CMTMemoryPool<CMemoryPool<CTest>,?CCriticalSection>*?CTest::s_pool?=?NULL;

void?testFun()
{
????int?i;
????const?int?nLoop?=?10;
????const?int?nCount?=?10000;
????
????for(int?j?=?0;?j<nLoop;?++j)
????{
????????typedef?CTest*?LPTest;
????????LPTest?arData[nCount];
????????for(i=0;i?<nCount;?++i)
????????{
????????????arData[i]?=?new?CTest;
????????}

????????for(i=0;i?<nCount;?++i)
????????{
????????????delete?arData[i];
????????}
????}
}

int?main(int?argc,?char*?argv[])
{
????{
????????unsigned?int?dwStartTickCount?=?GetTickCount();

????????CTest::NewPool();

????????testFun();
????????
????????CTest::DeletePool();
????????
????????cout?<<?"total?cost"?<<?GetTickCount()?-?dwStartTickCount?<<?endl;
????}


????system("pause");

????return?0;
}

在我機器上測試結果比系統(tǒng)默認的CRT實現(xiàn)高效N倍。

轉載自:

http://www.cppblog.com/weiym/archive/2012/05/05/173785.html

轉載于:https://blog.51cto.com/7044041/1856098

總結

以上是生活随笔為你收集整理的一个高效的内存池实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品国产亚洲av无码娇色 | 日韩中文字幕网址 | 少妇高潮一区二区三区99 | 一区二区三区视频在线播放 | 中文字幕在线观看线人 | 国产视频三级 | 久久国产传媒 | 日本天天色 | 国产精品毛片久久久久久久av | 伊人av在线| 精品国产18久久久久久二百 | av伊人久久 | 丁香花完整视频在线观看 | 校园春色综合 | 91视频看| 中国农村一级片 | 久久成人18免费观看 | 婷婷中文字幕在线 | 黄色草逼视频 | 亚洲av成人一区二区国产精品 | 深夜在线视频 | a级在线免费观看 | 激情小说激情视频 | 蜜桃av免费看 | 欧美黑人激情 | 超碰com | 国产精品国产精品国产 | 无码国产精品一区二区色情男同 | a级黄色小视频 | 国模在线视频 | 国模视频在线 | 岛国精品| 日本大尺度电影免费观看全集中文版 | 久久视频在线 | 波多野结衣绝顶大高潮 | 国产精品麻豆一区 | 久久久久久久久国产精品 | 嫩草视频在线免费观看 | 777奇米四色 | а√天堂www在线天堂小说 | 无码人妻黑人中文字幕 | 亚洲视频a | 欧美日韩第一区 | 麻豆精品在线观看 | 91中文字幕永久在线 | 不卡免费视频 | 成人免费毛片色戒 | 欧美国产日韩在线 | 欧美高跟鞋交xxxxxhd | 你懂的网站在线观看 | 丰满秘书被猛烈进入高清播放在 | 午夜少妇久久久久久久久 | 不卡精品| 天堂中文网 | 91丨porny丨| 日韩av一二三 | 久草热在线观看 | 久久久久久av无码免费网站下载 | 国产在线黄色 | 欧洲女性下面有没有毛发 | 18禁男女爽爽爽午夜网站免费 | 欧美无极品 | 欧美成人三级在线 | 亚洲爆乳无码精品aaa片蜜桃 | 成人精品三级av在线看 | 中文字字幕在线观看 | 国产精品视频h | 国模杨依粉嫩蝴蝶150p | 欧美精品自拍视频 | 国产成人传媒 | 日本黄色小片 | www成人啪啪18软件 | 青青草原综合网 | 国产裸体美女永久免费无遮挡 | 日本韩国中文字幕 | 69成人免费视频 | 午夜在线小视频 | 成人av免费网站 | 亚洲AV无码乱码国产精品牛牛 | 欧美少妇色图 | 人妻精品一区二区在线 | 性色在线 | 在线播放毛片 | 男女无遮挡做爰猛烈视频 | 男人天堂视频在线 | 深田咏美中文字幕 | 久久久久青草 | 免费av一区 | 亚洲蜜臀av乱码久久精品蜜桃 | 在线一区二区视频 | 日日骚网| 精品二区视频 | 天天操好逼 | 欧美图片一区 | 国产chinesehd精品露脸 | 黄色中文视频 | 人人妻人人爽一区二区三区 | 中国一级特黄录像播放 | 爆操白虎 |