#include<iostream>
#include<ctime>
using namespace std;
//内存池功能的实现
class A
{
public:
static void* operator new(size_t size);//分配内存算法
static void operator delete(void* ptr);//释放内存算法
static int malloc_cout;//实际malloc的次数
static int new_cout;//申请内存的次数
private:
A* next;//用以指向当前内存相邻的下一块内存
static A* cur_ptr;//指向当前内存
static int multi;//内存池的倍数
};
int A::malloc_cout = 0;
int A::new_cout = 0;
A* A::cur_ptr = nullptr;
int A::multi = 50;
void* A::operator new(size_t size)
{
A* tmplink = nullptr;
if (cur_ptr == nullptr)
{
size_t realsize = size * multi;//实际分配内存大小
cur_ptr = reinterpret_cast<A*>(new char[realsize]);//调用系统new分配内存
tmplink = cur_ptr;
while (tmplink != &cur_ptr[multi - 1])//用你链表将内存池的小内存链接
{
tmplink->next = tmplink + 1;
++tmplink;
}
tmplink->next = nullptr;
++malloc_cout;//统计实际分配内存的次数
}
tmplink = cur_ptr;
cur_ptr = cur_ptr->next;//cur_ptr始终指向可分配内存的首地址
++new_cout;//统计申请分配次数
return tmplink;
}
void A::operator delete(void *phead)
{
(static_cast<A*>(phead))->next = cur_ptr;//用链表将要释放的内存地址给cur_ptr,从而可以下次分配
cur_ptr = static_cast<A*>(phead);
}
int main()
{
clock_t start, end;
start = clock();
for (int i = 0; i < 500'0000; ++i)
{
A* pa = new A();
}
end = clock();
cout << "申请分配内存的次数为:" << A::new_cout << endl;
cout << "实际分配内存的次数为:" << A::malloc_cout << endl;
cout << "花费时间:" << end - start << "ms" << endl;
return 0;
}
内存池的代码实现
最新推荐文章于 2024-02-03 00:18:37 发布