Skip to content

Commit 55cb1c1

Browse files
authored
简易内存池
1 parent 772b2c3 commit 55cb1c1

File tree

1 file changed

+188
-0
lines changed

1 file changed

+188
-0
lines changed

simpleMemoryPool

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<ctime>
4+
using namespace std;
5+
6+
template<class T>
7+
class MemPool
8+
{
9+
private:
10+
//内存块结构
11+
typedef struct BlockNode
12+
{
13+
void* _memory;//内存块地址
14+
BlockNode* _next;//下一个blockNode
15+
size_t _objNum;//内存块对象的个数
16+
//构造函数---num表示申请对象的个数
17+
BlockNode(size_t num)
18+
:_objNum(num),
19+
_next(nullptr)
20+
{
21+
_memory = malloc(_objNum*_size);
22+
}
23+
24+
~BlockNode()
25+
{
26+
free(_memory);
27+
_memory = nullptr;
28+
_next = nullptr;
29+
_objNum = 0;
30+
}
31+
}BlockNode;
32+
protected:
33+
static size_t _size;//单个对象的大小
34+
T* _releaseMemory = nullptr;//释放的内存
35+
BlockNode* _requestMemory;//申请的内存块
36+
size_t _maxNum;//内存块最大的大小
37+
size_t _useCount;//当前内存块已经使用的对象个数
38+
protected:
39+
//设置单个对象的大小
40+
static size_t setSize()
41+
{
42+
return (sizeof(T) >= sizeof(T*) ? sizeof(T):sizeof(T*));
43+
}
44+
public:
45+
MemPool()
46+
:_useCount(0),
47+
_releaseMemory(nullptr),
48+
_maxNum(100000*_size)
49+
{
50+
//开始先申请32个_size大小的空间
51+
_requestMemory = new BlockNode(32);
52+
}
53+
54+
~MemPool()
55+
{
56+
BlockNode *cur = _requestMemory;
57+
while (cur)
58+
{
59+
BlockNode* del = cur;
60+
cur = cur->_next;
61+
delete del; //会自动调用~BlockNode()
62+
}
63+
}
64+
65+
T* New()
66+
{
67+
//先在releaseMemory中找
68+
if (_releaseMemory)
69+
{
70+
T* obj = _releaseMemory;
71+
_releaseMemory = *((T**)_releaseMemory);//releaseMemory的前几个字节存储的是下一个节点的地址
72+
return obj;
73+
}
74+
else
75+
{
76+
//判断requesetMemory中是否还有空闲内存
77+
if (_requestMemory->_objNum == _useCount)
78+
{
79+
//取物理内存中申请一块内存
80+
size_t size = 2 * _useCount >= _maxNum ? _maxNum : 2 * _useCount;
81+
BlockNode* newBlock = new BlockNode(size);
82+
83+
newBlock->_next = _requestMemory;
84+
_requestMemory = newBlock;
85+
_useCount = 0;
86+
}
87+
//走到这里,一定有内存
88+
T* obj = (T*)((char*)_requestMemory->_memory+_useCount*_size);
89+
90+
_useCount++;
91+
return new(obj)T();//用定位new对这块空间初始化
92+
}
93+
}
94+
95+
void Delete(T* obj)
96+
{
97+
if (obj)
98+
{
99+
obj->~T();
100+
101+
*((T**)obj) = _releaseMemory;
102+
_releaseMemory = obj;
103+
}
104+
}
105+
};
106+
107+
//静态成员变量,类外初始化
108+
template<typename T>
109+
size_t MemPool<T>::_size = MemPool<T>::setSize();
110+
111+
struct TreeNode
112+
{
113+
int _val;
114+
TreeNode* _left;
115+
TreeNode* _right;
116+
};
117+
void test1()
118+
{
119+
MemPool<TreeNode> mp;
120+
121+
vector<TreeNode*> v;
122+
for (int i = 0; i < 10; i++)
123+
{
124+
TreeNode* mem = mp.New();
125+
v.push_back(mem);
126+
}
127+
128+
for (int i = 0; i < 10; i++)
129+
{
130+
mp.Delete(v[i]);
131+
}
132+
}
133+
134+
void test2()
135+
{
136+
MemPool<TreeNode> tnPool;
137+
std::vector<TreeNode*> v1;
138+
//申请110000个treeNode
139+
//使用MemPoll申请
140+
size_t begin1 = clock();
141+
for (int i = 0; i < 110000; ++i)
142+
{
143+
v1.push_back(tnPool.New());
144+
}
145+
for (int i = 0; i < 110000; ++i)
146+
{
147+
tnPool.Delete(v1[i]);
148+
}
149+
v1.clear();
150+
151+
size_t end1 = clock();
152+
153+
//使用new和delete
154+
size_t begin2 = clock();
155+
for (int i = 0; i < 110000; ++i)
156+
{
157+
v1.push_back(new TreeNode);
158+
}
159+
160+
for (int i = 0; i < 110000; ++i)
161+
{
162+
delete v1[i];
163+
}
164+
v1.clear();
165+
size_t end2 = clock();
166+
//使用malloc和free
167+
size_t begin3 = clock();
168+
for (int i = 0; i < 110000; ++i)
169+
{
170+
v1.push_back((TreeNode*)malloc(sizeof(TreeNode*)));
171+
}
172+
for (int i = 0; i < 110000; ++i)
173+
{
174+
free(v1[i]);
175+
}
176+
v1.clear();
177+
size_t end3 = clock();
178+
179+
cout <<"MemPool " <<end1 - begin1 << endl;
180+
cout << "new/delete " << end2 - begin2 << endl;
181+
cout << "malloc/free " << end3 - begin3 << endl;
182+
}
183+
184+
int main()
185+
{
186+
test2();
187+
return 0;
188+
}

0 commit comments

Comments
 (0)