栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【STL源码剖析】配置器(待补充)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【STL源码剖析】配置器(待补充)

文章目录
  • 【STL源码剖析】配置器(待补充)
    • 2.1 空间配置器的标准接口
    • 2.2.2 SGI特殊的空间配置器 std::alloc
    • 2.2.3 构造和析构的基本工具:construct()和destroy()
    • 2.2.4 空间的配置与释放:std::alloc
    • 2.2.5 第一级配置器 __malloc_alloc_template剖析

【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剖析
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990769.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号