当前位置:网站首页>【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剖析
边栏推荐
- 左手梦想 右手责任 广汽本田不光关注销量 还有儿童安全
- How to open a stock account? Is it safe to open a mobile account?
- 云原生数据库VS传统数据库
- [leetcode] 11. Container with the most water
- Hashcat 的使用
- DDD concept is complex and difficult to understand. How to design code implementation model in practice?
- Search two-dimensional matrix [clever use of bisection + record solution different from inserting bisection]
- Integration of metersphere open source continuous testing platform and Alibaba cloud cloud cloud efficient Devops
- 门店无线音箱造假?索尼回应:产品预留了有线连接接口 复杂场景下可以使用
- What are the SQL aggregate functions
猜你喜欢

软件测试人员的7个等级,据说只有1%的人能做到级别7

探索C语言程序奥秘——C语言程序编译与预处理

业务与技术双向结合构建银行数据安全管理体系

【Proteus仿真】Arduino UNO+数码管显示4x4键盘矩阵按键

Please run IDA with elevated permissons for local debugging.

当他们在私域里,掌握了分寸感

After integrating the aurora push plug-in in the uni app, the real machine debugging prompts "the currently running base does not contain the native plug-in [jg-jpush]..." Solutions to problems
![[leetcode] 11. Container with the most water](/img/40/8bb6506a29f8da797432fee50d3aad.png)
[leetcode] 11. Container with the most water

【FPGA】串口以命令控制温度采集

门店无线音箱造假?索尼回应:产品预留了有线连接接口 复杂场景下可以使用
随机推荐
中信证券手机开户是靠谱的吗?安全吗
Exploring the mystery of C language program -- C language program compilation and preprocessing
Investigation on key threats of cloud computing applications in 2022
Chrysanthemum chain (winter vacation daily question 39)
内网学习笔记(6)
Intranet learning notes (5)
Kaggle 专利匹配比赛金牌方案赛后总结
【移动端】手机界面的设计尺寸
Use of hashcat
放养但没有完全放养(春季每日一题 2)
O (log (min (m, n))
实战攻防演练中的四大特点
创新药二级市场审饼疲劳:三期临床成功、产品获批也不管用了
linux上查看mysql的密码_Linux下MySQL忘记密码「建议收藏」
Experience of epidemic prevention and control, home office and online teaching | community essay solicitation
Lizuofan, co-founder of nonconvex: Taking quantification as his lifelong career
Test / development programmers, 30, do you feel confused? And where to go
MCN机构遍地开花:博主和作者要谨慎签约、行业水很深
‘distutils‘ has no attribute ‘version
The ecosystem of the yuan universe

