C++项目定长内存池

Posted Huang_ZhenSheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++项目定长内存池相关的知识,希望对你有一定的参考价值。

解决固定大小的内存申请释放需求

性能达到极致,不考虑内存碎片等问题

第一次: 

#include<iostream>
using std::cout;
using std::endl;

template<class T>
class ObjectPool

public:
	T* New()
	
		if (RemainBytes < sizeof(T))//如果剩余的内存不足一个对象的大小
		
			_memory = (char*)malloc(128 * 1024);//128KB空间
			if (_memory == nullptr)
			
				throw bad_alloc();
			
		
		T*obj = (T*)_memory;
		_memory += sizeof(T);
		RemainBytes -= sizeof(T);
		return ojb;
	
	void Delete(T* obj)
	
		if (_freeList == nullptr)
		
			_freeList = obj;
			//*(int*)obj = nullptr;//32位平台下
			*(void**)obj = nullptr;//解引用看void*大小
		
	
private:
	char* _memory = nullptr;//一个char一个字节,往后方便切出内存块,指向大块内存的指针
	void* _freeList = nullptr;//还回来过程中的链接的自由链表指针
	size_t RemainBytes = 0;//大块内存在切分的过程中剩余的字节数
;

 内存的释放:

void Delete(T* obj)
	
		if (_freeList == nullptr)
		
			_freeList = obj;
			//*(int*)obj = nullptr;//32位平台下
			*(void**)obj = nullptr;//解引用看void*大小
		
		else
		
			*(void**)obj = _freeList;
			_freeList = obj;
		
	

 ===》优化成链表的头插

void Delete(T* obj)
	
		*(void**)obj = _freeList;
		_freeList = obj;
	

 定长内存池的完整代码的实现:

#include<iostream>
using std::cout;
using std::endl;

template<class T>
class ObjectPool

public:
	T* New()
	
		T*obj = nullptr;
		//优先把还回来的内存块对象再次重复利用
		if (_freeList)
		
			void* next = *(void**)_freeList;
			obj = _freeList;//还回来的内存块
			_freeList = next;
		
		else
		
			if (_RemainBytes < sizeof(T))//如果剩余的内存不足一个对象的大小
			
				_RemainBytes = 128 * 1024;
				_memory = (char*)malloc(_RemainBytes);//128KB空间
				if (_memory == nullptr)
				
					throw bad_alloc();
				
			
			obj = (T*)_memory;
			size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);
			_memory += objSize;
			_RemainBytes -= objSize;
		
		//定位new,显示调用T的构造函数初始化
		new(obj)T;

		return obj;
	
	void Delete(T* obj)
	
		obj->~T()//显示调用析构函数
		//链表的头插
		*(void**)obj = _freeList;
		_freeList = obj;
	
private:
	char* _memory = nullptr;//一个char一个字节,往后方便切出内存块,指向大块内存的指针
	void* _freeList = nullptr;//还回来过程中的链接的自由链表指针
	size_t _RemainBytes = 0;//大块内存在切分的过程中剩余的字节数
;

以上是关于C++项目定长内存池的主要内容,如果未能解决你的问题,请参考以下文章

高并发内存池项目(C++实战项目)

高并发内存池项目(C++实战项目)

C++从零实现一个高并发内存池

C++从零实现一个高并发内存池

C++从零实现一个高并发内存池

高并发内存池——基于Google开源项目tcmalloc的简洁实现