定长内存池
项目源代码:高并发内存池
1.项目介绍
这是一个 C++ 中的对象池(Object Pool)的简单实现,用于更有效地管理对象的内存分配和回收。对象池是一种内存管理技术,旨在减少频繁分配和释放对象的开销,从而提高程序的性能。
- 以下是该对象池的一些关键部分和功能:
New() 函数:用于获取一个新的对象。它首先检查是否有已归还的内存块,如果有,则使用归还的内存,否则从内存池中分配一个新的对象。它使用 malloc 来分配内存,然后使用定位 new 来调用对象的构造函数,初始化对象。
Delete() 函数:用于回收一个对象。它首先调用对象的析构函数以清理对象,然后将对象添加到内存池的归还链表中。为了解决不同对象类型的大小差异问题,它使用了一个二级指针 _freeList,这样不同类型的对象都可以通过 _freeList 连接在一起。
内存分配:初始时,对象池会通过 malloc 分配一块大内存块,大小为1024 * 128字节。然后,通过不断更新 _memory 指针和 _remainBytes 记录内存块的剩余空间,来实现对象的内存分配。
性能测试:在代码中,有一个测试函数 TestObjectPool,用于测试直接使用 new 和对象池分配的性能差异。它执行多轮的分配和释放操作,以测量两种方法的性能。
这个对象池的实现是为了演示目的而创建的,可以在需要管理大量相同类型对象的情况下提高性能
2.代码部分
- ObjectPool.h
#pragma once
#include<vector>
#include<iostream>
#include<time.h>
template <class T>
class ObjectPool
{
public:
T* New()
{
T* obj = nullptr; //给一个对象指针 指向内存
if (_freeList) //如果有归还的内存先用归还内存
{
//next指向freelist+sizeof(T)的一个位置
void* next = static_cast<void*>(static_cast<char*>(_freeList) + sizeof(T));
//void* next = *((void**)_freeList);
obj = (T*)_freeList;
_freeList = next