当前位置:网站首页>【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剖析

原网站

版权声明
本文为[Cloudeeeee]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43972154/article/details/125425793