c 記憶體池的實現 可以new複雜物件

2021-07-03 10:50:32 字數 3708 閱讀 8920

/*

使用說明:

1>.四個介面malloc()/free()/mempool_new()/mempool_delete()分別對應標準庫函式malloc()/free()和操作符new()/delete()

2>.如果是qt專案請開啟#define qt巨集定義

3>.如果是win32專案則預設就可以

4>.如果是linux c/c++(非第三方類庫)請用pthread實現乙個_lock類替換

注意事項:

1>.介面mempool_new是類似於系統呼叫new的介面,但是由於物件建構函式這裡只實現到0~4個引數,如果超過則需修改本類模板,新增更多引數的構造實現.

2>.建構函式的引數型別如果存在volatile/const等修飾,則同樣需要自己實現乙個.

舉 例:

cmemorypoolmymempool;

std::list* plst = mymempool.mempool_new();//複雜物件,會呼叫其構造.

struct my******struct* pstru = mymempool.malloc(sizeof(my******struct));//簡單物件.

*/#ifndef memorypool_hpp

#define memorypool_hpp

//#define qt //加入到windows專案或者其他專案的開關

#include

#include

#include

#ifndef qt

#include

#else

#include

#endif

using

namespace

std;

#define in

#define out

#define max_block_type 16

#define max_unit_num 1024

#ifndef qt

class _lock

~_lock(void)

inline

void lock()

inline

void unlock()

protected:

critical_section m_cslock;

};#else

class _lock

~_lock(void)

inline

void lock()

inline

void unlock()

protected:

qmutex m_mxlock;

};#endif

typedef

struct mem_block

~mem_block()

} mem_block, *lpmem_block;

typedef

struct mem_pool

} mem_pool, *lpmem_pool;

template

class cmemorypool

catch (...)

return p;

}template

inline t* mempool_new(in const t0 & a0)

catch (...)

return p;

}template

inline t* mempool_new(in const t0 & a0,in const t1 & a1)

catch (...)

return p;

}template

inline t* mempool_new(in const t0 & a0,in const t1 & a1,in const t2 & a2)

catch (...)

return p;

}template

inline t* mempool_new(in const t0 & a0,in const t1 & a1,in const t2 & a2,in const t3 & a3)

catch (...)

return p;

}void mempool_delete(in t* p);

void* malloc(in const

int ilen);

void free(in void* p);

bool isempty();

protected:

mem_pool m_mempool;

_lock m_csmaplock;

map m_mapmalloc;

int m_imaxusemem;

};template

cmemorypool::cmemorypool(void)

template

cmemorypool::~cmemorypool(void)

}return;

}template

void cmemorypool::setusememlimte(in int imaxusemem)

template

void cmemorypool::mempool_delete(in t* p)

template

void* cmemorypool::malloc(in int ilen)

// 申請的記憶體超過了上限

if (i == max_block_type)

return p;

// 申請初始記憶體塊

m_mempool.m_cslock.lock();

if (!m_mempool.m_pmemblock[i])

m_mempool.m_cslock.unlock();

lpmem_block pb = m_mempool.m_pmemblock[i];

if (!pb)

return p;

while (pb)

// 這個記憶體塊用完了

if (!pb->m_pnext)

pb->m_pnext = new (std::nothrow)mem_block(m_mempool.m_iunitsize[i]);

if (!pb->m_pnext)

m_mempool.m_iusedmem += m_mempool.m_iunitsize[i] * max_unit_num;

}pb->m_cslock.unlock();

pb = pb->m_pnext;

}return p;

}template

void cmemorypool::free(in void *p)

m_csmaplock.unlock();

if (!pb)

return;

pb->m_cslock.lock();

memset(p, 0, pb->m_iunitsize);

pb->m_dqaddr.push_back((char*)p);

pb->m_cslock.unlock();

return;

}template

bool cmemorypool::isempty()

#endif //memorypool_hpp

C 記憶體池的實現

file memorypool.h note hangzhou hikvision system technology co.ltd.all right reserved.brief windows下記憶體池的實現 author zhangpeng nj 163.com date 11 15 201...

記憶體池的C 實現。

原文 最近在學習c 程式效能優化,讀到記憶體池部分。自己動手寫了乙個,小小測試了一下應該沒有問題。記憶體塊memoryblock宣告檔案 cpp view plain copy pragma once define ushort unsigned short define ulong unsigne...

C 記憶體池的實現

記憶體池是一種自主的記憶體管理機制。就是將我們的記憶體管理放在了應用程式端。那麼它的簡單處理做了什麼事呢?首先,我們從堆上分配出一塊很大的記憶體塊。接著我們按照劃分將其劃分成每個不同的小組。這個每個小組儲存乙個資料塊。針對於每個小組的組內來說就是乙個簡單的資料結構。這個資料結構我們將其分為兩個部分,...