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;//
};
}