当前位置:网站首页>【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剖析
边栏推荐
- 产业互联网的概念里有「互联网」字眼,但却是一个和互联网并不关联的存在
- 当人们用互联网式的思维和视角来看待产业互联网的时候,其实已陷入到了死胡同
- AssertionError: CUDA unavailable, invalid device 0 requested
- 如何选择正规安全的外汇交易平台?
- beescms网站渗透测试和修复意见「建议收藏」
- DDD concept is complex and difficult to understand. How to design code implementation model in practice?
- Status quo analysis: how "one cloud and multi-core" can promote the rapid deployment of information innovation projects
- Sumati GameFi生态纵览,神奇世界中的元素设计
- 左手梦想 右手责任 广汽本田不光关注销量 还有儿童安全
- Test / development programmers, 30, do you feel confused? And where to go
猜你喜欢

The role of software security testing, how to find a software security testing company to issue a report?

创新药二级市场审饼疲劳:三期临床成功、产品获批也不管用了

Left hand dreams right hand responsibilities GAC Honda not only pays attention to sales but also children's safety
Cusdis - lightweight, privacy first open source comment system | chain of the city

EasyCVR平台EHOME协议接入,视频播放出现断流是什么原因?

文件系统 -- 磁盘基础知识和FAT32文件系统详细介绍

Please run IDA with elevated permissons for local debugging.

Sumati GameFi生态纵览,神奇世界中的元素设计

leetcode:2104. Subarray range and

门店无线音箱造假?索尼回应:产品预留了有线连接接口 复杂场景下可以使用
随机推荐
Talking about the advantages of flying book in development work | community essay solicitation
Is the compass reliable? Is it safe to open a securities account?
‘distutils‘ has no attribute ‘version
O (log (min (m, n))
Logminer database log mining
中文地址与英文地址
How do the TMUX color palette work?
Is CICC securities reliable? Is it safe to open a securities account?
测试/开发程序员,30而立,你是否觉得迷茫?又当何去何从......
Intranet learning notes (7)
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
保险APP适老化服务评测分析2022第06期
How to open a stock account? Is it safe to open a mobile account?
探索C语言程序奥秘——C语言程序编译与预处理
Explanation of FTP protocol
泰山OFFICE技术讲座:竖排时中文标点的简单研究
What is the reason for the disconnection of video playback due to the EHOME protocol access of easycvr platform?
困牛排序(寒假每日一题 40)
Stocking but not completely stocking (daily question 2 in spring)
菊花链(寒假每日一题 39)

