簡單內存池設計

關鍵詞 內存池 鏈表

class A
{
public:
	static void* operator new(size_t size);
	static void operator delete(void* phead);
	static int m_iCout;//分配計數統計,每new一次,就統計一次
	static int m_iMallocCount;//每次malloc一次,統計一次

private:
	A* next;
	static A* m_FreePost;//總是指向一塊可以分配出內存的首地址
	static int m_sTrunkCout;//一次分配多少倍的該類內存
};

int A::m_iCout = 0;
int A::m_iMallocCount = 0;
A* A::m_FreePost = nullptr;
int A::m_sTrunkCout = 5;//一次分配五倍的該類內存作爲內存池的大小


void* A::operator new(size_t size)
{
	A* temp;
	if (m_FreePost == nullptr)
	{
		//申請一大塊內存
		size_t realsize = m_sTrunkCout * size;
		//傳動new調用的是系統傳遞的malloc
		m_FreePost = reinterpret_cast<A*>(new char[realsize]);
		temp = m_FreePost;

		//把分配出來的一大塊內存,彼此關聯起來,供後續使用
		for (; temp != &m_FreePost[m_sTrunkCout - 1]; ++temp)
		{
			temp->next = temp + 1;
		}

		temp->next = nullptr;
		++m_iMallocCount;

	}

	temp = m_FreePost;
	m_FreePost = m_FreePost->next;//更新可用內存塊地址
	++m_iCout;
	return temp;


}

void A::operator delete(void* phead)
{
	(static_cast<A*>(phead)->next) = m_FreePost;
	m_FreePost = static_cast<A*>(phead);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章