C++内存管理(候捷)第四讲 笔记

上中下三个classes分析

Loki allocator的三个类,从低阶到高阶分别为:Chunk, FixedAllocator, SmallObjAllocator

Chunk:pData指针,指向分配的一个chunk,firstAvailableBlock_索引,指向第一个可用区块是第几块,blocksAvailable_目前还可以供应的区块数

FixedAllocator:chunks_是vector放了很多chunk,allocChunk_和deallocChunk_是指针,指向某两个chunk

SmallObjAllocator:pool_是vector放了很多FixedAllocator, pLastAlloc和pLastDealloc两个指针指向pool里的某两个

Class Chunk分析


Init :初始化,被更上层的class调用。new调用mallloc创建对象,分配一大块chunk。
Reset :可用的block个数为64,第一个可以的block的编号为0,然后一个for循环,把每个block的第一个字节当作索引index使用(类似于嵌入式指针)
Release :使用delete[],释放空间,还给操作系统

Chunk的Allocate:分配一个可用区块(最高优先权),然后firstAvailableBlock_指向下一个可用区块,比如这里可用区块的索引从左边的4变成了右边的3(4地址对应区块的第一个索引数字是3,即下一优先区块为3),剩余区块个数也相应调整

Chunk的Deallocate函数:释放的指针p已经确定在这个Chunk中,但是需要确定p是Chunk的第一个block,用p减去头指针,除以block大小,得到释放的block索引,这个释放回收的块block具有最高优先权,成为firstAvailableBlock_,然后可利用的block个数+1.

class FixedAllocator分析

allocChunk_指向最近一次满足分配动作的Chunk,再次分配时优先判断该chunk是否满足分配

deallocChunk 指向最近一次回收的Chunk,再次回收先从该chunk确认
Allocate:如果有最近的allocChunk
,那么直接取区块,否则就要for循环从头开始遍历每个chunk,直到找到有可用空间的chunk。return allocChunk->Allocate(blockSize_);是向这个chunk取区块

一个vector在push_back时可能发生搬运操作,deallocChunk可能失效,需要重新设定,无法确定指到哪,只好指向头

Deallocate函数:调用VicinityFind函数查找还回来的指针p落在哪个chunk,找到之后交给第一级Chunk类的Deallocate来处理

VicinityFind(临近搜寻):

chunkLength是chunk的大小,lo是上次还回来的chunk,hi是下一个chunk,loBound和hiBound是vector的头跟尾

一路往上查找,一路往下查找。

在lo里面找,找不到的话就往上面的chunk去查找,一直往上,一个接一个的chunk去找

然后在hi里面找,找不到就往下面的chunk去查找,一直往下,一个接一个的chunk去找

旧版这段代码,如果释放了不属于该分配器分配的指针,会进入死循环

调用Deallocate函数进行回收,然后确认是否是全回收的情况处理。

全回收的时候,需要确认有2个chunk,才回收一个,就是前一讲的deferring延缓回收

Loki::allocator总结

相关推荐
linweidong几秒前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
冷雨夜中漫步4 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
半桔5 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo5 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春6 小时前
C++之多重继承
c++·多重继承
m0_736919106 小时前
C++代码风格检查工具
开发语言·c++·算法
Gain_chance6 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
Gain_chance8 小时前
36-学习笔记尚硅谷数仓搭建-DWS层数据装载脚本
大数据·数据仓库·笔记·学习
2301_763472468 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
肖永威8 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos