0.铺垫
- 作为程序员(C/C++)我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能
- 下面就先设计 一个定长内存池做个开胃菜,当然这个定长内存池在后面的高并发内存池中也是有价值的,所以学习他目的有两层
- 先熟悉一下简单内存池是如何控制的
- 会作为后面内存池的一个基础组件
- 定长内存池特点 – 固定大小的内存申请释放需求
- Windows和Linux下如何直接向堆申请页为单位的大块内存:
1.理解
![请添加图片描述](https://i-blog.csdnimg.cn/direct/7337af747d3f40c3a52a8868f6dbfe30.png)
- 定长内存池设计
![请添加图片描述](https://i-blog.csdnimg.cn/direct/0146477f562c46908335b8f802b7ad6e.png)
2.实现
#pragma once
#include <iostream>
#include "Common.h"
template<class T>
class ObjectPool
{
public:
T* New()
{
T* obj = nullptr;
if (_freeList)
{
obj = (T*)_freeList;
_freeList = *(void**)_freeList;
}
else
{
if (_remainBytes < sizeof(T))
{
_remainBytes = 128 * 1024;
_memory = (char*)SystemAlloc(_remainBytes >> 13);
if (_memory == nullptr)
{
throw std::bad_alloc();
}
}
obj = (T*)_memory;
size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);
_memory += objSize;
_remainBytes -= objSize;
}
new(obj)T;
return obj;
}
void Delete(T* obj)
{
obj->~T();
*(void**)obj = _freeList;
_freeList = obj;
}
private:
char* _memory = nullptr;
void* _freeList = nullptr;
size_t _remainBytes = 0;
};