日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

(转载)简单linux C++内存池

發(fā)布時(shí)間:2025/4/16 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转载)简单linux C++内存池 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C++代碼 ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 在學(xué)習(xí)內(nèi)存池的過(guò)程中可謂云游太虛。一般都是針對(duì)標(biāo)準(zhǔn)內(nèi)存池再次實(shí)現(xiàn)。大部分以鏈表的形式討論。誠(chéng)然最正宗也最準(zhǔn)確,但是相對(duì)比較晦澀,本文是針對(duì)剛剛接觸內(nèi)存池的同學(xué)寫(xiě)的。大大減少了對(duì)內(nèi)存池整體認(rèn)識(shí)的難度。 ?? 內(nèi)存池: 如果程序中涉及頻繁申請(qǐng)釋放內(nèi)存,并且每次使用的內(nèi)存并不是很大,這時(shí)候應(yīng)該考慮內(nèi)存池。 內(nèi)存池可以有有效的避免內(nèi)存碎片的產(chǎn)生。 內(nèi)存池的框架: class MemPool{ public: MemPool(){初始化分配N個(gè)小的內(nèi)存塊} ~MemPool(){真正刪除整個(gè)分配了的內(nèi)存空間} void* getmem(){獲取內(nèi)存(塊)} void freemem(){釋放內(nèi)存到內(nèi)存池中,這里并不是真正的釋放掉內(nèi)存,只是回收再利用;} private: struct LinkBlock * p;//把很多小內(nèi)存塊關(guān)聯(lián)起來(lái)的結(jié)構(gòu),大部分寫(xiě)成鏈表的形式 mem_block* m_block;//一個(gè)小的內(nèi)存塊。 }; 工作機(jī)制: 事先分配出一大塊內(nèi)存,再把這一大塊分成很多小塊。當(dāng)程序中需要申請(qǐng)內(nèi)存時(shí)就拿出一小塊來(lái)用。用完了就把這一小塊放回大塊中(注意:這個(gè)小塊內(nèi)存并沒(méi)釋放掉!),只要不是一下用掉了所有一大塊內(nèi)存,無(wú)論多少次申請(qǐng)內(nèi)存都是重復(fù)利用這些小的內(nèi)存塊。知道程序結(jié)束真正釋放掉整片內(nèi)存。 所以用內(nèi)存池可以把大量的內(nèi)存申請(qǐng)控制在可計(jì)算的范圍內(nèi)。內(nèi)存碎片少。比如:如果用系統(tǒng)的new或者malloc申請(qǐng)10000次內(nèi)存,可能要10000的小的內(nèi)存空間,但是使用內(nèi)存池只需申請(qǐng)100塊空間,循環(huán)利用100次而已。作用顯而易見(jiàn)! ?? 為了讓程序簡(jiǎn)單明了使用STL標(biāo)準(zhǔn)庫(kù)的vector來(lái)充當(dāng)小內(nèi)存塊的管理器。 vector<char*> vec; 這樣每次申請(qǐng)的是vec的一個(gè)迭代器的空間。 ?? 代碼非原創(chuàng),稍稍做了改動(dòng)而已。 ======================================================================== MemPool.h ?? #ifndef _MEM_POOL_H??? #define _MEM_POOL_H???? #include <vector>??? #include <iostream>??? using namespace std;?? ?? /*? ????在內(nèi)存池中分配固定大小的內(nèi)存塊?? ????目的是加速內(nèi)存分配速度,并且減少因重復(fù)分配相同?? */?? ?? class CMemPool?? {?? public:?? ?????? ????//創(chuàng)建大小為blockSize的內(nèi)存塊,內(nèi)存池?cái)?shù)目為預(yù)分配的數(shù)目preAlloc??? ????CMemPool(int blockSize, int preAlloc = 0, int maxAlloc = 0);?? ?????? ????~CMemPool();?? ?????? ????//獲取一個(gè)內(nèi)存塊。如果內(nèi)存池中沒(méi)有足夠的內(nèi)存塊,則會(huì)自動(dòng)分配新的內(nèi)存塊??? ????//如果分配的內(nèi)存塊數(shù)目達(dá)到了最大值,則會(huì)返回一個(gè)異常??? ????void* Get();?? ?????? ????//釋放當(dāng)前內(nèi)存塊,將其插入內(nèi)存池??? ????void Release(void* ptr);?? ?????? ????//返回內(nèi)存塊大小??? ????int BlockSize() const;?? ?????? ????//返回內(nèi)存池中內(nèi)存塊數(shù)目??? ????int Allocated() const;?? ?????? ????//返回內(nèi)存池中可用的內(nèi)存塊數(shù)目??? ????int Available() const;?? ?????? private:?? ????CMemPool();?? ????CMemPool(const CMemPool&);?? ????CMemPool& operator = (const CMemPool&);?? ?????? ????enum?? ????{?? ????????BLOCK_RESERVE = 128?? ????};?? ?????? ????typedef std::vector<char*> BlockVec;?? ?????? ????int m_blockSize;?? ????int???????? m_maxAlloc;?? ????int???????? m_allocated;?? ????BlockVec??? m_blocks;?? };?? ?? inline int CMemPool::BlockSize() const?? {?? ????return m_blockSize;?? }?? ?? inline int CMemPool::Allocated() const?? {?? ????return m_allocated;?? }?? ?? inline int CMemPool::Available() const?? {?? ????return (int) m_blocks.size();?? }?? #endif?? ?? ========================================================= MemPool.cpp ?? ?? #include "MemPool.h"??? CMemPool::CMemPool(int blockSize, int preAlloc, int maxAlloc):?? m_blockSize(blockSize),?? m_maxAlloc(maxAlloc),?? m_allocated(preAlloc)?? {?? ????if ( preAlloc < 0 || maxAlloc == 0 || maxAlloc < preAlloc )?? ????{?? ????????cout<<"CMemPool::CMemPool parameter error."<<endl;?? ????}?? ?????? ????int r = BLOCK_RESERVE;?? ????if (preAlloc > r)?? ????????r = preAlloc;?? ????if (maxAlloc > 0 && maxAlloc < r)?? ????????r = maxAlloc;?? ????m_blocks.reserve(r);?? ????for (int i = 0; i < preAlloc; ++i)?? ????{?? ????????m_blocks.push_back(new char[m_blockSize]);?? ????}?? }????? CMemPool::~CMemPool()?? {?? ????for (BlockVec::iterator it = m_blocks.begin(); it != m_blocks.end(); ++it)?? ????{?? ????????delete [] *it;?? ????}?? }?? ?? void* CMemPool::Get()?? {???? ?????? ????if (m_blocks.empty())?? ????{?? ????????if (m_maxAlloc == 0 || m_allocated < m_maxAlloc)?? ????????{?? ????????????++m_allocated;?? ????????????return new char[m_blockSize];?? ????????}?? ????????else?? ????????{?? ????????????cout<<"CMemPool::get CMemPool exhausted."<<endl;?? ????????????return (void *)NULL;?? ????????}?? ????}?? ????else?? ????{?? ????????char* ptr = m_blocks.back();?? ????????m_blocks.pop_back();?? ????????return ptr;?? ????}?? }?? ?? ?? void CMemPool::Release(void* ptr)?? {??? ????memset(ptr,0,sizeof(char)*m_blockSize);//內(nèi)存回收回來(lái)以后并沒(méi)銷毀,原數(shù)據(jù)仍在,所以應(yīng)該清空 ????m_blocks.push_back(reinterpret_cast<char*>(ptr));?? }??? ?? ========= main.h ?? #include "stdafx.h" #include "MemPool.h" #include <string.h> int main(int argc, char* argv[]) { CMemPool *m_cache =new CMemPool(50,0,10); ?? char * src_date="abcdefg"; char *p1=(char*)(m_cache->Get()); char *p2=(char*)(m_cache->Get()); int *p3=(int*)(m_cache->Get()); strcpy(p1,src_date); strcpy(p2,src_date); p3[0]=9;p3[1]=25; ?? m_cache->Release(p1); m_cache->Release(p2); m_cache->Release(p3); ?? //把MemPool.cpp中void CMemPool::Release(void* ptr) 的 //memset(ptr,0,sizeof(char)*m_blockSize);注釋掉可以驗(yàn)證每次內(nèi)存回收以后是重復(fù)利用而非銷毀 cout<<*(int*)(m_cache->Get())<<endl; cout<<(char*)(m_cache->Get())<<endl; cout<<(char*)(m_cache->Get())<<endl; delete m_cache; ????return 0; } ?? 完畢! ?? 當(dāng)然這只是探究?jī)?nèi)存池而已,更高級(jí)的比如線程安全,內(nèi)存擴(kuò)容,模板等等,仍需解決。 但是相信想初窺內(nèi)存池門(mén)徑應(yīng)該還是有幫助的!
描述:以STL-vector為數(shù)據(jù)存儲(chǔ)單元,實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池功能。

總結(jié)

以上是生活随笔為你收集整理的(转载)简单linux C++内存池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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