【C++学习】STL之空间配置器之一级空间配置器

文章目录

    • 📊什么是空间配置器
    • ✈STL 提供六大组件的了解
    • 👀为什么需要空间配置器
    • 👍SGI-STL空间配置器实现原理
      • 🌂一级空间配置器的实现


📊什么是空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。
在这里插入图片描述

✈STL 提供六大组件的了解

  • 容器(containers):各种数据结构,如 vector, list, deque, set, map 用来存放数据。从实现的角度来看,STL 容器是一种 class template。
  • 算法(algorithms):各种常用的算法如 sort, search, copy, erase…从实现角度来看,STL 算法是一种 function template。
  • 迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。从实现角度来看,迭代器是一种将 operator *, operator ->, operator++, operator– 等指针相关操作予以重载的class template。
  • 仿函数(functors):行为类似函数,可以作为算法的某种策略。从实现角度来看,仿函数是一种重载了 operator() 的 class 或class template。
  • 适配器(adapters):一种用来修饰容器或仿函数或迭代器接口的东西。例如 STL 提供的 queue 和 stack,虽然看似容器,其实只能算是一种容器适配器,因为它们的底部完全借助 deque,所有操作都由底层的 deque 供应。
  • 配置器(allocator):负责空间配置与管理,从实现角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的 class template。

在这里插入图片描述

👀为什么需要空间配置器

  • 从使用 STL 层面而言,空间配置器并不需要介绍 ,因为容器底层都给你包装好了,但若是从 STL 实现角度出发,空间配置器是首要理解的。

  • 作为 STL 设计背后的支撑,空间配置器总是在默默地付出着。为什么你可以使用算法来高效地处理数据,为什么你可以对容器进行各种操作,为什么你用迭代器可以遍历空间,这一切的一切,都有“空间配置器”的功劳。

模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:

  • 空间申请与释放需要用户自己管理,容易造成内存泄漏。
  • 频繁向系统申请小块内存块,容易造成内存碎片。
  • 频繁向系统申请小块内存,影响程序运行效率。
  • 直接使用malloc与new进行申请,每块空间前有额外空间浪费。
  • 申请空间失败怎么应对。
  • 代码结构比较混乱,代码复用率不高。
  • 未考虑线程安全问题。

因此需要设计一块高效的内存管理机制。

👍SGI-STL空间配置器实现原理

以上提到的几点不足之处,最主要还是:频繁向系统申请小块内存造成的。那什么才算是小块内存?SGI-STL以128作为小块内存与大块内存的分界线,将空间配置器其分为两级结构,一级空间配置器处理大块内存,二级空间配置器处理小块内存。

🌂一级空间配置器的实现

  • 一级空间配置器原理非常简单,直接对malloc与free进行了封装,并增加了C++中
    set_new_handle思想。

实现代码:

template <int inst>
class __malloc_alloc_template
{
private:
 static void *oom_malloc(size_t);
public:
// 对malloc的封装
 static void * allocate(size_t n)
 {
   // 申请空间成功,直接返回,失败交由oom_malloc处理
 void *result = malloc(n);
 if (0 == result) 
   result = oom_malloc(n);
 return result;
 }
// 对free的封装
 static void deallocate(void *p, size_t /* n */)
 { free(p);}
 // 模拟set_new_handle
 // 该函数的参数为函数指针,返回值类型也为函数指针
 // void (*   set_malloc_handler( void (*f)() ) )()
 static void (* set_malloc_handler(void (*f)()))()
 {
 void (* old)() = __malloc_alloc_oom_handler;
 __malloc_alloc_oom_handler = f;
 return(old);
 }
};
// malloc申请空间失败时代用该函数
template <int inst>
void * __malloc_alloc_template<inst>::oom_malloc(size_t n)
{
void (* my_malloc_handler)();
void *result;
for (;;) 
{
   // 检测用户是否设置空间不足应对措施,如果没有设置,抛异常,模式new的方式
   my_malloc_handler = __malloc_alloc_oom_handler;
   if (0 == my_malloc_handler)
   {
       __THROW_BAD_ALLOC; 
   }
   
   // 如果设置,执行用户提供的空间不足应对措施
   (*my_malloc_handler)();
   
   // 继续申请空间,可能就会申请成功
   result = malloc(n);
   if (result)
       return(result);
}
}
typedef __malloc_alloc_template<0> malloc_alloc;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/566760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

录制课程用什么软件好?这2款软件让你脱颖而出

在当今这个信息化快速发展的时代&#xff0c;录制课程已经成为了一种常见的教学手段。无论是高校教师、培训师还是网络教育工作者&#xff0c;都需要借助一些软件来录制高质量的课程。那么&#xff0c;录制课程用什么软件好呢&#xff1f;接下来&#xff0c;本文将介绍两种常见…

DxO Nik Collection 6.10.0 8套滤镜胶片插件套件mac/win

DxO Nik Collection 6是一款专为摄影师和图像创作者打造的强大后期处理工具。无论是专业摄影师还是业余爱好者&#xff0c;它都能为您的照片带来前所未有的提升。 这款软件集合了众多经典的Nik滤镜插件&#xff0c;如Color Efex Pro、Silver Efex Pro等&#xff0c;以及新增的P…

微信抽奖活动怎么做_微信抽奖大狂欢

随着科技的飞速发展&#xff0c;微信已经成为我们生活中不可或缺的一部分。它不仅仅是一个简单的通讯工具&#xff0c;更是一个集社交、购物、娱乐等多种功能于一体的平台。今天&#xff0c;我们为大家带来了一场别开生面的微信抽奖活动&#xff0c;让你在享受乐趣的同时&#…

Linux CentOS 7中Nginx 1.8.0 安装SSL证书

文章目录 前言一、创建一个文本文件&#xff0c;将每个证书的内容复制并粘贴到文件中二、将证书文件和私钥上传服务器三、编辑nginx的配置文件四、重新载入nginx配置文件五、使用浏览器访问自己的域名测试证书是否成功即可六、服务器证书的备份与恢复注意 前言 要在Nginx中安装…

面试题集中营—分布式共识算法

分布式共识算法目标 分布式主要就是为了解决单点故障。一开始只有一个服务节点提供服务&#xff0c;如下图所示。那么如果服务节点挂了&#xff0c;对不起等着吧。 为了服务的高可用性&#xff0c;我们一般都会多引入几个副节点当备份&#xff0c;当服务节点挂了&#xff0c;就…

羊大师:夏季羊奶的好处有哪些?

夏季羊奶的好处主要包括以下几点 1.增强免疫力&#xff1a;羊奶中的钙元素丰富&#xff0c;能有效为身体补充营养物质&#xff0c;增强自身的免疫能力。羊奶还富含上皮细胞生长因子&#xff08;EGF&#xff09;&#xff0c;对人体鼻腔、咽喉、血管、肠胃等黏膜有良好的修复作用…

day83 AJAX

1什么是AJAX AJAX语法 AJAX Asynchronous JavaScript and XML 异步js和XML 实现页面某一部份更新&#xff0c;无需服务器转发或重定向 1 $.ajax() 语法: $.ajax( { "url" : "url&qu…

Android11 SystemUI clock plugin 插件入门

插件的编写 参照ExamplePlugin&#xff0c;需要系统签名。 需要先编译以下模块得到jar&#xff0c;引用在项目中。 m SystemUIPluginLibcom.android.systemui.permission.PLUGIN PluginManager.addPluginListener SystemUI 是如何发现 clock plugin 的&#xff1f; Syste…

光纤网络电力控制系统设计方案:623-6U CPCI的光纤网络电力控制系统

6U CPCI的光纤网络电力控制系统 一、设备概述 柔性直流输电系统中用于控制与测量的FS系统&#xff0c;适用于风电和太阳能发电的并网快速数值计算和闭环控制&#xff0c;以及与直流输电系统的换流器有关的特殊控制功能&#xff0c;包括门控单元的信号处理。该控制板的最大…

仓储管理解决方案:混合低代码与定制开发,实现高灵活性与高效率

引言 在当今竞争激烈的商业环境中&#xff0c;仓储管理成为了企业供应链中不可或缺的一环。有效的仓储管理不仅可以帮助企业降低库存成本、提高库存周转率&#xff0c;还能够提升客户满意度和整体运营效率。然而&#xff0c;随着市场需求的不断变化和业务规模的不断扩大&#…

第⑯讲:Ceph集群Pool资源池管理以及PG的数据分布的核心技术要点

文章目录 1.Pool资源池的管理1.1.查看Pool资源池列表1.2.创建一个Pool资源池1.3.查看Pool资源池的参数信息1.4.修改Pool资源池的参数信息1.5.为Pool资源池设置应用模式1.6.重命名Pool资源池1.7.设置Pool资源池的限额1.8.删除Pool资源池1.9.查看Pool资源池的利用率 2.PG的数据分…

打印菱形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int k 0;int j 0;//打印上半部分&#xff1b;for (i 1; i < 4; i){//打印空…

【机器学习300问】78、都有哪些神经网络的初始化参数方法?

在训练神经网络时&#xff0c;权重初始化是确保良好收敛的关键步骤之一。不合适的初始化方法可能会导致梯度消失或爆炸&#xff0c;特别是在深层网络中。那么都有哪些神经网络的初始化参数方法呢&#xff1f;选择它这些方法的原则是什么&#xff1f; 一、常用神经网络初始化参…

Parallels Desktop 19完美中文版 PD19虚拟机详细图文安装教程 亲测兼容M1/M2

对于许多Mac用户来说&#xff0c;运行Windows应用程序是必不可少的。也许你的雇主使用的软件只适用于Windows&#xff0c;或者需要使用依赖于某些Windows技术的网站。或者你想在Mac上玩Windows游戏。或者&#xff0c;你可能需要在其他操作系统上测试应用程序和服务——你可以在…

Tomcat启动闪退疑难排解全攻略:资深技术视角详解(详细)

Tomcat 启动闪退问题是在尝试启动Apache Tomcat服务器时&#xff0c;遇到的一种情况&#xff0c;其中服务器进程无法正常运行并立即退出。这个问题可能是由于多种原因造成的&#xff0c;包括配置错误、端口冲突、类加载问题等。作为一个资深技术人员&#xff0c;解决这类问题需…

Llama3本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Vitis HLS 学习笔记--优化指令-BIND_OP_STORAGE

目录 1. BIND_OP_STORAGE 概述 1.1 BIND_OP 1.2 BIND_STORAGE 2. 语法解析 2.1 BIND_OP 2.2 BIND_OP 用法示例 2.3 BIND_STORAGE 2.4 BIND_STORAGE 示例 3. 实例演示 4. 总结 1. BIND_OP_STORAGE 概述 BIND_OP_STORAGE 其实是两个优化指令的合称&#xff1a;BIND_OP…

SAM5808B 法国追梦DREAM 音频DSP芯

法国追梦/DERAM SAM5504/5704/5716/5808音频DSP芯片,开发板&#xff0c;方案 可用于电子鼓、电子琴、电吉他、效果器、均衡器、啸叫抑制器等电声产品领域 一、全系列芯片&#xff1a; SAM2634 SAM2695 SAM5504B SAM5704B SAM5708B SAM5808B SAM5716B SAM5916B... 二…

python基础知识一(注释、变量以及类型、类型转换)

目录 注释&#xff1a; 注释分为两种&#xff1a; 注释的作用&#xff1a; 注释的使用原则&#xff1a; 编写一段代码&#xff0c;对比一下有无注释的区别&#xff0c;以冒泡排序为例 1. 无注释版&#xff1a; 感官上是不是有点不清晰&#xff1f; 2. 有注释版&#xff1…

介绍TCP三次握手、传输数据、四次挥手标志为确认号变化规律

TCP协议的三次握手是一个关键过程&#xff0c;用于在客户端和服务器之间建立可靠的连接。以下是三次握手的详细过程&#xff0c;包括标志位、序列号以及ACK的变化规律&#xff1a; 第一次握手&#xff1a; 客户端&#xff1a; 标志位&#xff1a;SYN1&#xff08;表示请求建立…