dl
dl_memory_reuse.h
浏览该文件的文档.
1
10#pragma once
11
12#include <vector>
13#include <list>
14#include <map>
15
16
17namespace dl::Memory
18{
19
21template<typename T>
22class Reuse
23{
24public:
26 {}
27
28 template<typename... Args>
29 T* New(Args&& ...args)
30 {
31 void* p;
32 if (_list.empty())//没有空闲内存则新建
33 {
34 p = malloc(sizeof(T));
35 }
36 else
37 {
38 p = _list.back();
39 _list.pop_back();
40 }
41 return new (p) T(args...);
42 }
43
44 void Delete(T* p)
45 {//调用析构函数,并放入list
46 ((T*)p)->~T();
47 _list.push_back(p);
48 }
50 {
51 for (auto& iter : _list)
52 free(iter);
53 }
54private:
55 std::vector<void*> _list;
56};
57
59template<typename T>
61{
62public:
64 {}
65
66 template<typename... Args>
67 T* New(Args&& ...args)
68 {
69 void* p = nullptr;
70 if (_list.empty())
71 {
72 if (_countCur + 1 > _countMax)
73 return nullptr;
74 p = malloc(sizeof(T));
75 if (!p)
76 return nullptr;
77 }
78 else
79 {
80 p = _list.back();
81 _list.pop_back();
82 }
83 T* pp = new (p) T(args...);
84
85 {
86 assert(_newList.find(pp) == _newList.end());
87 _newList[pp] = 1;
88 ++_countCur;
89 }
90
91 return pp;
92 }
93
94 bool Delete(T* p)
95 {
96 {
97 if (!p)
98 return true;
99 auto it = _newList.find(p);
100 if (it == _newList.end())
101 {
102 assert(0 && "Not Find Memory Object");
103 delete p;
104 return false;
105 }
106 _newList.erase(it);
107 --_countCur;
108 }
109
110 ((T*)p)->~T();
111 _list.push_back(p);
112 return true;
113 }
114
115 bool Find(T* p)
116 {
117 auto it = _newList.find(p);
118 return it != _newList.end();
119 }
120
121 void Clear2Num(size_t num)
122 {
123 if (num >= _list.size())
124 return;
125 auto iter0 = _list.begin() + num;
126 for (auto iter1 = iter0; iter1 != _list.end(); ++iter1)
127 {
128 free(*iter1);
129 }
130 _list.erase(iter0, _list.end());
131 }
132
133 void Reserve(size_t n)
134 {
135 _list.reserve(n);
136 }
137
138 void SetCountMax(int n)
139 {
140 _countMax = n;
141 }
142
143 size_t GetCountMax()
144 {
145 return _list.size() + _countCur;
146 }
147
148 size_t GetCount()
149 {
150 return _countCur;
151 }
152
154 {
155 return _list.size();
156 }
157
159 {
160 for (auto& iter : _list)
161 free(iter);
162 assert(_countCur == 0);
163 }
164
165private:
166 std::vector<void*> _list;
167 size_t _countCur = 0;
168 size_t _countMax = 64000;
169 std::unordered_map<T*, size_t> _newList;
170};
171}
T * New(Args &&...args)
内存相关