#include
#include
#include
#include
#include "const.h"
#include "utilityfunc.h"
#include "hashtable.h"
#include "logmsg.h"
#define system_page_size 4096
#define default_max_num 128
typedef enum enummempooloper // 對記憶體池的4種操作
enummempooloper;
extern bool g_bcollectorstarted;
template
class mempoolcls
;// int getusednum() ;
// int getsize() ;
t* getmem();
bool recyclemem(t* pclsmem);
// void printall();
unsigned long getrecyclefailednum() ;
unsigned long* getmemaccess() ;
protected:
void initmempool();
t** m_ppmempool;
int m_intmaxnum;
int m_currpos;
int m_intrecnum;
//sem_t m_semmempool;
pthread_mutex_t m_mutex;
bool m_bprealloc;
bool m_blogget1fail;
bool m_blogput1fail;
unsigned long m_ulmemaccess[mempool_oper_count];
// 除錯資訊
bool debug_mempool;
hashtablecls *m_mapallptr; // 儲存所有指標
unsigned char *m_pusedflag;
};template
mempoolcls::~mempoolcls()
else
}free(m_ppmempool);}}
template
mempoolcls::mempoolcls()
template
void mempoolcls::enabledebug()
template
void mempoolcls::setmaxnum(int maxnum, bool bprealloc)
template
void mempoolcls::initmempool()
m_ulmemaccess[mempool_total_size] = m_intmaxnum * sizeof(t);
pairrslt;
///// for heap memory alloc test.
//if( m_bprealloc )
}catch( ... )
m_currpos = 0;
m_intrecnum = 0;
//e->delete();
printf( " sys mem alloc fail! exiting ... " );
getchar();
exit(-1);
//return;
}for(int i = 0 ; i < m_intmaxnum ; i++)
// }
++pstartbuffer;
//test to see if we've got want we want.
trycatch(...)
}m_currpos = 0;
m_intrecnum = 0;
// // dyn
// int m, n;
// for(m = 0 ; m < m_intmaxnum-1 ; m++)
// for(n = m+1 ; n < m_intmaxnum ; n++)
// if( m_ppmempool[m] == m_ppmempool[n] )
// printf( "init mem dup! %d %d\n", m, n );
//sem_post(&m_semmempool);
pthread_mutex_unlock (&m_mutex);
return;
}///
void *ptemp = null;
int ntemp = 0;
for(int i = 0 ; i < m_intmaxnum ; i++)
// 記錄所有的指標
sprintf(strinfo, "%d, 0x%x\n", ntemp, m_ppmempool[i]);
log(logtype_error, strinfo);}}
// 2011-02-21 生成i的bitmap,表示是否被分配出去
if ( debug_mempool )
else
bzero(m_pusedflag, ntemp);
}m_currpos = 0;
m_intrecnum = 0;
//sem_post(&m_semmempool);
pthread_mutex_unlock (&m_mutex);
}template
t* mempoolcls::getmem()
m_ulmemaccess[mempool_get1_fail]++;
ptemp = null;
goto function_exit;}}
return ptemp;
}return bret;
}//template
//void mempoolcls::printall()
//;//
// for ( m = 0; m < m_intmaxnum; m++ )
//
// k += sprintf(strtemp + k, "%8x ", m_ppmempool[m]);
//
// if ( 0 == (m+1)%10 )
//
// }
//}
一種記憶體池的實現方法
大圖 這裡使用python的 來解釋 size 是呼叫者意欲分配的記憶體大小 def allocate size 如果這裡分配的大小大於了最大快取的size 直接通過malloc operatornew 申請 if size max pooled size use malloc or operato...
一種巧妙的記憶體池演算法 HeapBlock
在乙個簡單的gui庫中看到的演算法,非常巧妙,適用於需要頻繁分配和釋放相同大小資料塊的情況,如gui庫中的視窗結構,socket結構等,演算法額外開支極小。cpp view plain copy print?typedef dword hblockheap typedef unsigned char...
記憶體池的實現 一
引言 c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。而直接使用系統呼叫malloc free new delete進行記憶體分配和釋放,有以下弊端 呼叫malloc new,系統需要根據 最先匹配 最優匹配 或...