記憶體池的一種實現

2021-06-06 20:00:20 字數 3389 閱讀 9116

#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,系統需要根據 最先匹配 最優匹配 或...