当前位置:网站首页>【STL源码剖析】配置器(待补充)
【STL源码剖析】配置器(待补充)
2022-06-24 22:40:00 【Cloudeeeee】
文章目录
【STL源码剖析】配置器(待补充)
标题前的数字(如 “2.1 空间配置器的标准接口”中的数字 2.1 )代表在《STL源码剖析》一书中的章节号。
2.1 空间配置器的标准接口
“字典”:
ptrdiff_t
ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。ptrdiff_t定义在stddef.h(cstddef)这个头文件内。ptrdiff_t通常被定义为long int类型。
set_new_handler(x)
在利用operator new请求内存分配失败的时候,在抛出异常之前,会调用一个回调函数给程序员一个机会去处理内存分配失败的情况。x 代表的是一个函数指针,指向程序员自己定义的用户处理内存分配失败时候的函数。在这段代码中将 x 设置为nullptr或者0表示程序员放弃这个处理机会,直接抛出bad_alloc异常。
::operator new , ::operator delete
当我们在C++中使用new 和delete时,其实执行的是全局的 ::operator new 和 ::operator delete , :: 前不加命名空间则表示最外层的默认的命名空间。
new( p ) T1(value);
就是在指针p所指向的内存空间创建一个T1类型的对象,但是对象的内容是从T2类型的对象转换过来的,就是在已有空间的基础上重新调整分配的空间。这个操作就是把已有的空间当成一个缓冲区来使用,这样就减少了分配空间所耗费的时间,因为直接用new操作符分配内存的话,在堆中查找足够大的剩余空间速度是比较慢的。
inline 内联函数
使用内联函数可以避免函数调用的开销,当调用一个函数时,除了函数执行语句的开销外,还有很多其他的开销,如拷贝形参、返回时恢复等等,使用内联函数时,程序并不会执行“调用”,而是相当于把函数内的语句在此处抄了一遍,执行单纯的语句比执行函数的速度要快一些,因此使用内联函数可以避免函数调用的开销。
注释:
2.2.2 SGI特殊的空间配置器 std::alloc
2.2.3 构造和析构的基本工具:construct()和destroy()
主要是针对对象的构造和析构,在对象构造前,内存已经分配了,在对象析构后,内存才会被释放。
trivial destructor
如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。
2.2.4 空间的配置与释放:std::alloc
size_t
size_t的全称是size_type,用来表示某种类型的大小、字节数,size_t是一种记录大小的数据类型。
空间的配置与释放的设计哲学:
- 向system heap中要求空间
- 考虑多线程(multi-threads)的状态(本文不考虑多线程的情况)
- 考虑内存空间不足时的应变措施
- 考虑碎片空间过多的问题
C++内存配置的基本操作 ::operator new() (全局函数)
C++内存释放的基本操作 ::operator delete()(全局函数)
它们的底层使用的是C语言的malloc()函数和free()函数完成的内存空间的配置与释放
SGI的双层级设置器(为了解决碎片空间问题):
第一级配置器(__malloc_alloc_template):直接使用 malloc() 和 free() 函数进行分配空间和释放空间
第二级配置器(__default_alloc_template):针对碎片空间采用memory pool的整理方法
使用策略:当配置区块超过128kb时,视为空间足够大,直接采用第一级配置器;否则采用第二级配置器。
2.2.5 第一级配置器 __malloc_alloc_template剖析
边栏推荐
- [leetcode] 11. Container with the most water
- 门店无线音箱造假?索尼回应:产品预留了有线连接接口 复杂场景下可以使用
- Basic use of transformers Library
- Cake review fatigue in the secondary market of innovative drugs: phase III clinical success and product approval
- 谈谈飞书对开发工作的优势 | 社区征文
- 3年测试经验,连简历上真正需要什么都没搞明白,张口就要20k?
- TSDB在民机行业中的应用
- 云原生数据库VS传统数据库
- Constant current circuit composed of 2 NPN triodes
- 内网学习笔记(7)
猜你喜欢
元宇宙的生态圈
Sumati GameFi生态纵览,神奇世界中的元素设计
The ecosystem of the yuan universe
[leetcode] 11. Container with the most water
左手梦想 右手责任 广汽本田不光关注销量 还有儿童安全
Sumati gamefi ecological overview, element design in the magical world
做软件安全测试的作用,如何寻找软件安全测试公司出具报告?
Dataease template market officially released
創新藥二級市場審餅疲勞:三期臨床成功、產品獲批也不管用了
Please run IDA with elevated permissons for local debugging.
随机推荐
How to quickly familiarize yourself with the code when you join a new company?
获取图片外链的方法–网易相册[通俗易懂]
Left hand dreams right hand responsibilities GAC Honda not only pays attention to sales but also children's safety
1-6搭建Win7虚拟机环境
Notes on BGP part of CCNP
Constant current circuit composed of 2 NPN triodes
Intranet learning notes (5)
Convert string array to list collection
泰山OFFICE技术讲座:竖排时中文标点的简单研究
当一个接口出现异常时候,你是如何分析异常的?
Rod and Schwartz cooperated with ZhongGuanCun pan Lianyuan Institute to carry out 6G technology research and early verification
元宇宙的生态圈
beescms网站渗透测试和修复意见「建议收藏」
Basic layout -qhboxlayout class, qvboxlayout class, qgridlayout class
June 24, 2022: golang multiple choice question, what does the following golang code output? A:1; B:3; C:4; D: Compilation failed. package main import ( “f
Android Internet of things application development (smart Park) - set sensor threshold dialog interface
探索C语言程序奥秘——C语言程序编译与预处理
创新药二级市场审饼疲劳:三期临床成功、产品获批也不管用了
折叠屏将成国产手机分食苹果市场的重要武器
write a number of lines to a new file in vim