C++STL内存管理源码剖析

1
2
3
可以通过重载operator new()/operator delete()、operator new[] ()/operator delete[] ()接管内存分配,一般重载为类的静态(对象还没有创建)函数,而不会重载为全局函数,因为把控不了,风险太大。
4
Complex* pc=new Complex(1,2);实现可能有两种情况:
a、1/3/2先分配内存,再调用构造去初始化这块内存,最后将m_instance指针指向这块内存(编译器优化情况)。
b、1/2/3先分配内存,再将m_instance指针指向这这段内存,最后调用构造去初始化这块内存。
5
可以通过set_new_handler设置处理异常的函数指针。
6
7
int* ip=new int[10];与Demo* p=new Demo[3];一般类型(int/double等)与自定义类在堆中数组内存布局不同。
new()/delete()、new[] /delete[]成对匹配使用,智能指针最好用其工厂函数(std::make_shared())创建。
8
上下cookie+debug的内存+用户获取到的内存+pad(用于16字节对齐),并借用了一字节用来做是否给出的标记
9
10
11
12
13
14
指针,32位系统指针大小为4字节,64位为8字节。此处利用union设计了一个嵌入式指针,此方法非常经典。
15
16
简化写法,需要内存池的该类的堆内存管理,在类中写入该macro即可。
17
打印其创建出来的元素地址值会出现连续的情况
18
VC中的allocator中没有任何特殊设计,辗转还是调用malloc,malloc
STL中的6个typedef,模板编程用于类型萃取。
19
5种iterator_category,继承关系的struct,而不是枚举,算法和仿函数通过iterator_traits获取其类型,通过模板特化或者片特化实现实现重载。从而得到容器的内存分布特点,根据不同的内存分布重载调用更优的算法。

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
山穷水尽后的处理,没有尝试将系统剩余内存,是否满足索取量不断折半的要求,会导致其他app没有内存可用,也并未回收16根链表挂载的区块。

总结:为什么要用内存管理?
1、减少内存碎片,对其进行管理。
2、减少cookie提高利用率。
3、减少对malloc和free调用次数,提高效率。
4、用户态切和内核态的切换

内存管理及内存池实现
侯捷C++内存管理课件
SGI-STL(version3.3)

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大胡子的艾娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值