C++ -- 固定長メモリ プールの簡単な実装

1.固定長メモリプールとは何ですか?

        C/C++ では、メモリの動的適用は malloc を通じて行われますが、実際にはヒープからメモリを直接適用するのではなく、大きなメモリ ブロックが malloc を通じて動的に適用されます。Malloc はメモリ プールに相当します。その後、それをプログラムに割り当てて使用し、適用されたメモリが使い果たされた場合、または不足した場合、要求されたメモリが現在の残りのメモリを超えた場合、オペレーティング システムからメモリを申請します。

        メモリ プールは主にメモリを動的に適用する際の効率の問題を解決しますが、もちろんメモリの断片化の問題も解決できます。

        固定長メモリ プールは、大きなメモリ ブロックとしてオペレーティング システムに malloc を適用し、それを使用する必要があるプログラムに割り当てます。使用後にメモリ プールを返却する行為。ただし、機能が単一であり、固定長のメモリ要件しか解決できず、さらに解放されないメモリを占有します。
その基本的な構造は次のとおりです。

#pragma once
#include <iostream>
#include <vector>
#include <time.h>

using std::cout;
using std::cin;
using std::endl;

namespace sss
{
	template<class T>
	class Objectpool
	{
	public:
		T* New()//开辟大小
		{
			T* obj = nullptr;
			//内存重复利用
			if (_freeleft)
			{
				void* next = *(void**)_freeleft;
				obj = (T*)_freeleft;
				_freeleft = next;
			}
			//开辟空间
			else if (_reminBytes <sizeof(T))
			{
				_reminBytes = 128 * 1024;
				_memory = (char*)malloc(_reminBytes);
				if (_memory == nullptr)//判断是否为空
				{
					throw std::bad_alloc();//抛异常
				}
			}

			obj = (T*)_memory;
			size_t objSize = sizeof(T) < sizeof(void*) 
                             ? sizeof(void*) : sizeof(T);
            //保证在32位或64位下性能正常使用,因为一个指针最小为4字节

			_memory += sizeof(T);//往后加内存
			_reminBytes -= sizeof(T);//剩余内存
			//定位new;

			new(obj)T;//调用T的构造函数

			return obj;

		}

		void Delete(T* obj)//释放内存
		{
			obj->~T();
			/*if (_freeleft == nullptr)
			{
				_freeleft = obj;
				obj = nullptr;
			}*/
			//头插
			*(void**)obj =_freeleft;//32位64位都可以运行
			_freeleft = obj;
		}
	private:
		char* _memory;//开辟的大小
		size_t _reminBytes=0;//剩余的大小
		void* _freeleft;//
	};
}

おすすめ

転載: blog.csdn.net/weixin_66828150/article/details/132902757