Stl源码剖析读书笔记之Alloc细节
阅读基础:
Foo *pf = new Foo; 执行了两个步骤: 1)::operator new 向系统申请内存. 2) 调用Foo::Foo()构造函数构造实例. ==> 申请内存,构造实例。
delete pf; delete; 执行了两个步骤: 1)调用Foo::~Foo()析构函数. 2). ::operator delete释放内存. ==> 析构实例,释放内存。
Stl Alloc实现:
Stl为了高效利用内存,将这两部分分开,分成了四个操作( 构造::construct()/析构::destroy(),申请内存(alloc:allocate())/释放内存(alloc::deallocate() ).
而设计的精髓是双层级内存分配器,主要是想实现一个内存池实现内存快速分配以及解决小型内存块频繁申请释放,耗费系统内存问题(free_list),第一级直接使用malloc和free,第二级视情况采用不同策略。
双层级内存分配器:
1. 第一级配置器以malloc、free、realloc等C函数执行实际的内存配置、释放、重配置等操作,并实现出类似C++ new-handler的机制,它不能直接运用C++ new-handler的机制,因为它并非使用::operator new来配置内存。 所谓 c++ new-handeler机制是:你可以要求系统在内存配置需求无法被满足时,调用一个你所指定的函数。换句话说,一旦::operator new无法申请到内存时,在抛出std::bad_alloc异常状态之前,会先调用由用户指定的处理函数,该处理函数通常即被称为new-handler。
2. SGI第二级配置器的做法:如果要申请的内存大小超过128bytes时,就交给第一级配置器处理,当申请的内存小于128bytes时,则以内存池管理,此法又称为次层配置:每次向系统申请一大块内存,并维护一个自由链表(free_list),下次如果有相同大小的内存需求,就直接从自由链表中取出即可,如果释放小内存,就由配置器回收到自由链表中(只析构实例,但回收其占用的内存)。SGI第二级配置器会将任何小内存的申请需求量上调至8的倍数,并维护16个free-lists,每个Node管理大小分别为8,16,32,,,128的多个内存块。 以为申请的内存是8的倍数,而回收的内存也必然是8的倍数,只需放到合适的free_list节点即可。
记住几个点:
1. 内存池通过start_free, end_free,去记录当前备用的空闲内存块(必然是一整块连续的空间), end_free - start_free的结果必然是8的倍数.
2. free_list不足以分配内存时,就会向内存池申请,重新申请内存时,start_free和end_free会更新,直到重新向系统申请一块新的内存。
3. 从内存池中获取的内存不足时,如果依然有一些零头内存(必然是8的倍数),将这些内存挂载到合适的free_list节点下,再向系统申请内存。
最新文章
- Asp.Net的两种开发方式
- JS子父窗口互相取值赋值详解介绍
- How To Install Linux, Nginx, MySQL, PHP (LEMP) Stack on Debian 7
- 使用配置方式进行ssh的整合以及管理员管理的案例(二)
- SpringMVC(四)
- 免费的SqlServer优化辅助工具:SqlOptimize (原创)
- Android 数据库ORM框架GreenDao学习心得及使用总结<;二>;
- Maven简述
- BZOJ_2764_[JLOI2011]基因补全_DP_高精度
- [转]ORACLE 11G 导出报错(EXP-00003)未找到段 (0,0) 的存储定义
- python语法_while循环_for循环
- CVE-2017-12615和CVE-2017-12616
- 七、持久层框架(MyBatis)
- 20155226《网络攻防》 Exp3 免杀原理与实践
- SQLServer2008:在查看表记录或者修改存储过程时出现错误。错误消息为: 目录名无效
- OpenStack的基本概念与架构图
- 【转载】springboot + swagger
- 在使用完全拷贝过来的类文件(带xib文件)时,要及时修改 File&#39;s Owner
- NOIP初赛前一日记
- ctci1.3
热门文章
- Unable to the boot Simulator ! Mac开机现“CoreTelephony Trace File Error”,
- Leetcode: Longest Substring with At Most K Distinct Characters &;&; Summary: Window做法两种思路总结
- filter过滤器怎么写
- Drawable和Bitmap区别
- JSON.stringify////////////////////////////////zzzzzzzzzzzzzz
- (一)NOR FALSH 讲解
- SQL语句处理一些修改、新增、删除、修改属性操作(MySql)
- python实现汉诺塔
- Openbox简单支持平铺
- Linux中profile文件详解(转)