侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! !
一、C++ 面向对象高级开发
1、C++面向对象高级编程(上)
2、C++面向对象高级编程(下)
二、STL 标准库和泛型编程
1、分配器、序列式容器
2、关联式容器
3、迭代器、 算法、仿函数
4、适配器、补充
三、C++ 设计模式
四、C++ 新标准
五、C++ 内存管理机制
1、primitives
2、std::allocator
3、malloc/free
4、other allocators
5、loki::allocator
六、C++ 程序的生前和死后
五、C++内存管理机制 —— 分配器 allocator(侯捷)
- 演变过程:
- per-class allocator
- static allocator
- global allocator
- 标准库分配器 std::allocator
- VC6 的标准分配器
- BC5 的标准分配器
- GNU4.9 的标准分配器
- GNU2.9 的标准分配器
👉 该课程能让你:从平地到万丈高楼!—— 侯捷
👉 做到:心中自有丘壑!
💪 源码之前,了无秘密!
演变过程:
per-class allocator
- 为了减少
malloc的次数,使用我们重载的operator new(如下图右上角),一次挖一大块,然后当作linked list串穿起来,什么时候用到,直接给就行: - 降低
cookie的用量,由于一次malloc就有两个cookie占用8个字节,会增加浪费率; - 所以使用 内存池 ,不仅可以加快速度(速度考虑),还能降低利用率(空间考虑)。

union : 借用同一个东西的前四个字节当作指针来使用,从而减少内存的膨胀。

delete没有使用 free ,没有将内存还给操作系统,但不是内存泄漏(还都在自己的手上)。
如果要还的话,技术难点会非常高,这件事后面再讨论。

static allocator
如果还是像上面那样,任何需要分配器的
class都需要给它写一个版本,重复性动作太多了!!!
从软件工程的角度考虑,同样的东西应该把它集中到一个地方上去,这样将来如果改变也很方便,改一个地方就行了。
在面向对象领域我们不喜欢全局的东西,所以可以将上面的动作operator new / delete抽取出来,放到一个class里面,这个class就叫做allocator。

可以将allocator想象成一个指针,指向一个链表;意思是:每个class里面都有专门为自己服务的小型的static(静态的)allocator,这个allocator里面有一个单向链表:

- 这比先前的设计干净多了,
application classes不再与内存分配细节纠缠不清,所有相关细节都让allocator去操心,我们的工作是让application classes正确工作。
还有一种偷懒的实现方式,就是把上图黄色的这些东西定义成宏!

global allocator
而标准库的allocator如下,它有16个自由链表:




![[MAUI]模仿iOS多任务切换卡片滑动的交互实现](https://img-blog.csdnimg.cn/6fca7de1f85646dc894e72f43390f317.gif)














