标签:else 信息 字节 img 匹配 current max isl cin
大图:https://drive.google.com/file/d/1s5Y_xPB_k-gOXxC1iwG60Jx0kb8yyQ1b/view?usp=sharing
这里使用python的代码,来解释
# size 是调用者意欲分配的内存大小
def allocate(size):
# 如果这里分配的大小大于了最大缓存的size:直接通过malloc/operatornew 申请
if size > max_pooled_size:
use_malloc_or_operator_new(size);
return;
# 将意欲分配的size提升到匹配的size
size = ImproveSize(size)
# 获取对应size大小的index
index = GetIndexBySize(size)
# 如果内存池中有空闲该大小的内存
if not memory_pool[index].empty():
# 返回该地址
return memory_pool[index].pop_back();
else:
use_malloc_or_operator_new(size)
释放内存的过程,重点分支有两个:一个是分配的大小大于32MB,那么直接释放,如果小于32MB,那么应该返回到内存池中,但也不是无条件的返回到内存池,当内存池中该size的内存过多时,也应该释放。
def free(p):
# 该block太大,那么就应该直接释放
if BlockIsLargeThanMaxSize(p):
use_free_or_operator_delete(p);
else if currentBlockCachedNumMoreThanMax():
use_free_or_operator_delete(p);
else:
memory_pool[index].push_back(p)
cached_num++;
这种实现,对于每一刻分配的内存,都有一个头,来表示上下文,比如当前分配的大小,在内存池中idx大小,这样在是释放的时候,根据头的信息,能够方便是释放或缓存到内存池中。
size_t new_size = sizeof(BLOCK_HEADER) + size;
BLOCK_HEADER* p = static_cast<BLOCK_HEADER*>(operator new(new_size));
p->Magic[0] = 'M';
p->Magic[1] = 'P';
p->Index = -1;
p->Size = size;
// 和 operator delete
operator delete(block);
AtomicIncrement(&m_dwDeleteCount);
标签:else 信息 字节 img 匹配 current max isl cin
原文地址:https://www.cnblogs.com/bofengqiye/p/9217545.html