dl
dl
memory
dl_memory_reuse.h
浏览该文件的文档.
1
10
#pragma once
11
12
#include <vector>
13
#include <list>
14
#include <map>
15
16
17
namespace
dl::Memory
18
{
19
21
template
<
typename
T>
22
class
Reuse
23
{
24
public
:
25
Reuse
()
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
}
49
~Reuse
()
50
{
51
for
(
auto
& iter : _list)
52
free(iter);
53
}
54
private
:
55
std::vector<void*> _list;
56
};
57
59
template
<
typename
T>
60
class
ReuseCheck
61
{
62
public
:
63
ReuseCheck
()
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
153
size_t
GetCountFree
()
154
{
155
return
_list.size();
156
}
157
158
~ReuseCheck
()
159
{
160
for
(
auto
& iter : _list)
161
free(iter);
162
assert(_countCur == 0);
163
}
164
165
private
:
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
}
dl::Memory::ReuseCheck::Find
bool Find(T *p)
定义
dl_memory_reuse.h:115
dl::Memory::ReuseCheck::GetCount
size_t GetCount()
定义
dl_memory_reuse.h:148
dl::Memory::ReuseCheck::Reserve
void Reserve(size_t n)
定义
dl_memory_reuse.h:133
dl::Memory::ReuseCheck::SetCountMax
void SetCountMax(int n)
定义
dl_memory_reuse.h:138
dl::Memory::ReuseCheck::ReuseCheck
ReuseCheck()
定义
dl_memory_reuse.h:63
dl::Memory::ReuseCheck::~ReuseCheck
~ReuseCheck()
定义
dl_memory_reuse.h:158
dl::Memory::ReuseCheck::New
T * New(Args &&...args)
定义
dl_memory_reuse.h:67
dl::Memory::ReuseCheck::Clear2Num
void Clear2Num(size_t num)
定义
dl_memory_reuse.h:121
dl::Memory::ReuseCheck::Delete
bool Delete(T *p)
定义
dl_memory_reuse.h:94
dl::Memory::ReuseCheck::GetCountFree
size_t GetCountFree()
定义
dl_memory_reuse.h:153
dl::Memory::ReuseCheck::GetCountMax
size_t GetCountMax()
定义
dl_memory_reuse.h:143
dl::Memory::Reuse::Reuse
Reuse()
定义
dl_memory_reuse.h:25
dl::Memory::Reuse::~Reuse
~Reuse()
定义
dl_memory_reuse.h:49
dl::Memory::Reuse::New
T * New(Args &&...args)
定义
dl_memory_reuse.h:29
dl::Memory::Reuse::Delete
void Delete(T *p)
定义
dl_memory_reuse.h:44
dl::Memory
内存相关
定义
dl_memory.h:21
dl::KeyCode::T
@ T
定义
dl_input.h:121
制作者
1.13.1