项目-STL空间配置器

2023-11-18

这篇博客主要讲一下SGI-STL中的空间配置器的工作流程。

一、项目背景
  1. 小块内存带来的内存碎片问题(外碎片问题)
  2. 小块内存频繁申请释放带来的性能问题
二、空间配置器的思想

对于我们来说,对new和delete很熟悉,这两个函数可以分别完成内存的申请和释放,和c里面的malloc和free如出一辙。
Std::alloc的主要思想是:
(1)定义一个空间大小阈值,128bytes;
(2)如果申请的空间大于128bytes,那么就调用第一级空间适配器来完成分配工作;
(3)如果小于128bytes,那么就调用第二级空间适配器来完成。

一级空间配置器

一级空间配置器是以malloc(),free(),realloc()等C函数执行实际的内存配置、释放、重配置操作,并实现了C++的set_new_handler()函数。
它的内部设计实际就是为了压榨剩余的内存,达到内存的高效运用。所以一级空间配置器内部其实就是malloc和free的封装,然后尽量的开辟出用户想要的内存空间。
具体步骤如下:
这里写图片描述
一级空间配置器

二级空间配置器

二级空间配置器使用内存池+自由链表的形式避免了小块内存带来的碎片化,提高了分配的效率,提高了利用率。
见下图:
这里写图片描述
二级空间配置器

项目流程
  1. List.h、Vector.h是模仿STL容器中的两个list和vector的接口
  2. Allocate.h里面定义了内存池即空间配置器的两级实现
  3. Construct.h里面主要实现了对象的构造与析构接口
  4. Iterator.h里面有五种迭代器的定义、迭代器萃取、反向迭代器定义、迭代器型别萃取以及两个非常有用的函数 Distance、Advance
  5. TypeTraits.h定义了迭代器所指节点的值类型萃取,是否是POD类型
  6. Uninitialized.h里面是主要是一些拷贝、填充类的函数
  7. Main.cpp是测试文件,用来测试两个容器的接口和内存池实现正确与否
空间配置器的问题
  1. 在空间配置器中所有的函数和变量都是静态的,所以他们在程序结束的时候才会被释放发。二级空间配置器中没有将申请的内存还给操作系统,只是将他们挂在自由链表上。所以说只有当你的程序结束了之后才会将开辟的内存还给操作系统。

  2. 由于它没有将内存还给操作系统,所以就会出现二种极端的情况。
    2.1. 假如我不断的开辟小块内存,最后将整个heap上的内存都挂在了自由链表上,但是都没有用这些空间,再想要开辟一个大块内存的话会开辟失败。
    2.2. 再比如我不断的开辟char,最后将整个heap内存全挂在了自由链表的第一个结点的后面,这时候我再想开辟一个16个字节的内存,也会失败。
    解决方法:
    我想的是,针对2.1我们可以引入释放二级空间配置器的方法,但是这个释放比较麻烦。针对2.2我们可以合并自由链表上的连续的小的内存块。

  3. 为什么引入复杂的两级空间配置器?
    (1). 频繁使用malloc,free开辟释放小块内存带来的性能效率的低下
    (2). 内存碎片问题,导致不连续内存不可用的浪费

  4. 为什么所有成员函数都是静态的?
    是为了在外面通过作用域就可以调用,而不需要构造对象

  5. ROUNT_UP的实现原理是什么?
static size_t ROUND_UP(size_t bytes)//作用是将非8倍数的整数上调到8的倍数。
{
       return (((bytes)+__ALIGN - 1) &~(__ALIGN - 1));
}

round_up实现原理:
以 bytes = 30为例:
a. (30 + 7) = 37, 可以知道30的round_up为32, 给32加(8-1)的目的是让其(一定)大于32
b. 这样的话,以十进制形式,37肯定可以表达为如下的形式:(x*8 + y), 并且可以肯定这个y的值小于8,上述37表达形式为:(32 + 5)
c. 根据上述b步骤的形式,我们很自然的明白, 只要将 ((bytes) + 8-1) 转换为(x*8 + y)的形式后,然后再将y的值减去就达到目的了
d. 总结上述思路,我们要做事情有两个,一是将 ((bytes) + 8-1) 转换为 (x*8 + y)的形式; 二是将(x*8 + y)中的y值清零
e. 在十进制下,要完成上述任务,比较困难,而在二进制下,就非常好办
f. 首先,将 ((bytes) + 8-1) 转换为(x*8 + y), 只要将 ((bytes) + 8-1)的值转为二进制,如以37为例,其二进制为: 00100101,这样写你可能看得还不是很直观,这样写 (00100) (101),这样就可以发现,第一个小括号里面的值就为(x*8), 第二个小括号里面的值就为(y);接下来,我们的目的就很简单的, 将第二个小括号里面的所有位置为0即可, 参考上述网页中的规则“非运算和与运算结合,可以确保将指定位 清0, 故 & ~(__ALIGN - 1)的目的就是将第二个小括号中的位清0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

项目-STL空间配置器 的相关文章

  • 编写表格树GridTree过程遇到的问题

    项目中用到不少的树和表格 但是要用到表格树的地方不是很多 但是有时候需要的时候却不好找到 所以就在闲暇的时候自己找了一下 结果发现了很简单的 但是不满足项目的需求 于是就看懂了别人的东西之后 再结合自己的理解 干脆就做一个表格树好了 从写下
  • Angular 6 安装到使用

    TOC 前端 Angular 6 安装到使用 1 下载nodejs 并安装到本地 配置好环境变量 访问nodejs的官方网站的downdolad 网址 https nodejs org en download npm v 查看是否安装成功
  • 强大的jQuery图表插件库Highcharts支持线性图、饼状图、柱状图、区域图、气泡图

    Highcharts是一个纯JavaScript编写的jQuery图表插件库 Highcharts提供了简单的方式为您的网站或项目添加动态图表 Highcharts支持线性图 饼状图 柱状图 区域图 气泡图等近20种图表类型 下载地址 ht
  • mybatis(19)——choose标签,when标签和otherwise标签

    代码
  • JMeter简单使用

    一 下载安装 1 在官网下载或者在 share 192 168 1 201 share 开发工具 java apache jmeter 5 5 zip 2 解压 执行文件在bin目录中 二 常用测试组件 1 线程组 线程组是JMeter 中
  • 服务配置宝塔面板搭建环境及部署项目

    服务配置宝塔面板搭建环境及部署项目 1 登录你所购买阿里云服务器的账号 2 点击控制台 云服务器ecs 3 开通安全组开启端口 把需要访问的端口进行配置 选入方向 如 6379 8080 3306 80 21 22 443 4 获取服务器公
  • FOC和SVPWM的C语言代码实现   

    FOC和SVPWM的C语言代码实现 SVPWM的原理讲解在这儿 https blog csdn net qlexcel article details 74787619 comments 现在开始分析C语言的代码 代码建议复制到notepa
  • 【UE4】DataTable - 数据表

    本文使用 UE 4 26 引擎自带 ARPG 项目 从代码和编辑器两个方面记录一下 UE4 中的 DataTable 也就是数据表的用法 一 DataTable 是什么 DataTable 就是数据表 以下简称 DT 也就是二维的 M 行
  • OLED透明屏轻量化设计:提升便携性与用户体验的新方向

    随着科技的不断进步 OLED透明屏作为一种新兴的显示技术正逐渐走入人们的视野 除了在视觉效果上的优势 OLED透明屏在重量方面的设计也备受关注 对此 尼伽将深入探讨OLED透明屏轻量化设计的重要性 策略以及应用案例 希望看后对您有所启发 一
  • 面试机试题目,使用Spring + SpringMVC +Mybatis + html + css实现员工管理系统

    文章目录 机试挑战 需求分析 简介 访问地址 http 39 99 237 90 8080 employee http 39 99 237 90 8080 employee 源码 https github com Listen Y Java
  • Visual C++中函数的覆盖和函数的隐藏

    我是荔园微风 作为一名在IT界整整25年的老兵 今天来聊聊Visual C 中函数的覆盖和函数的隐藏 Visual C 中函数的覆盖和函数的隐藏与JAVA有很大不同 有些容易搞错的点和概念 我们要特别注意 首先 先满足一下急性子的同学 因为
  • 思科模拟器:nat地址转换-静态转换-动态转换-pat转换

    我么需要的环境 sw1为公司出口 192开头的网段为内网也就是公司内部 1动态 缺点 只能外网访问内网 内网无法访问外网 2静态 缺点 比如有两个公网ip如果在有两个人上网的时候 第三个人无法上网 由于使用设备不固定所以 外网无法访问内网
  • https证书过期处理方案及相关问题

    证书过期处理 1 替换证书操作 2 问题及处理 1 替换证书操作 证书由甲方提供 也可以去阿里云进行申请 前往nginx安装目录下的 conf cert替换旧的证书 目录 nginx conf cert 重启nginx操作 https bl
  • Android 开发中的权限申请

    一 权限动态申请 我们都知道 从 Android 6 0 开始 部分危险权限在 xml 注册的同时 还需要动态申请 1 需要动态申请的权限 Manifest permission CONTACTS 联系人 Manifest permissi
  • Pytorch 学习(三)sigmoid 逻辑回归预测

    1 数据预处理 处理多特征样本 import pandas as pd data pd read csv csv 划分数据 iloc 第一个参数 行 第二个参数 列 X data iloc 1 标签为 1 1 讲 1 替换为 0 Y dat
  • Shell中的幽灵王者—JAVAWEB 内存马 【认知篇】

    Goby社区第 21 篇技术分享文章 全文共 6700 字 预计阅读时间 17 分钟 自我介绍 大家好 我是 su18 无论是个人博客还是社区 已经很久没写技术文章了 原因有很多 时间 精力 心态等等 但在开源社区也算比较活跃 由于工作需要
  • JSONUtil.toJsonStr 时间变成了时间戳

    问题描述 我的接口是以Date来接收日期的 然后我在拿到这个对象参数后 通过hutool当中的JSONUtil toJsonStr将其序列化成json字符串 然后存储到数据库 然后存储到数据库当中发现这个字段是时间戳 DateTimeFor

随机推荐

  • 在Spring Boot使用Undertow服务

    1 undertow简介 Undertow是RedHAT红帽公司开源的产品 采用JAVA开发 是一款灵活 高性能的web服务器 提供了NIO的阻塞 非阻塞API 也是Wildfly的默认Web容器 在javaweb容器的世界里 Tomcat
  • mysql数据库三大引擎优缺点

    1 MyISAM 特性 不支持事务 表级锁定 并发性能大大降低 读写互相阻塞 适用场景 不支持事务 并发相对较低 表锁定 执行大量select语句操作的表 count 操作较快 不支持外键 注 查询速度快的原因 a MyISAM存储的直接是
  • sqlserver自动定时备份数据库并按日期命名

    sqlserver自动定时备份数据库并按日期命名 备份数据库是很有必要的 在维护软件和站点的时候关系到我们数据的安全和完整性 数据库为我们提供了自动备份功能 定时自动备份 SqlServerde 的维护计划中自带了备份数据库任务 并不是自动
  • Python 各种画图

    文章目录 Part I 基础知识 Chap I 快应用 Chap II 常用语句 Part II 画图样例 Chap I 散点图 Chap II 柱状图 Chap III 折线图 Chap IV 概率分布直方图 Chap V 累计概率分布曲
  • 用Python自动化处理Excel表格详解

    Excel表格基础知识 Excel表格可以帮助用户创建 编辑 格式化和计算数据 并生成各种图表和报表 Excel表格通常用于商业 金融 科学 教育等领域 Excel表格的常用操作 Excel表格的常用操作包括插入 删除 移动 复制 粘贴 排
  • ZYNQ LINUX 下 PL中断PS记录

    最近ZYNQ的项目需要 调试了PL中断PS的部分 下面将其中了解到信息记录下来 以防遗忘 如图一 图二所示 PL到PS的中断分为16个共享中断 SPI 和4个私有中断 PPI 本文用到了共享中断 着重介绍SPI中断 图一 图二 PL 侧16
  • 贝wa儿歌(安卓)

    本次贝wa儿歌为大家提供的是特殊版本的 软件需要注册登录才能才能使用VIP权限 安装好后 打开如果提示更新请点击取消 一定不要更新哦 贝瓦儿歌不仅只是儿歌 其实有很多分类的 包括有国学 动画 英语 故事 思维 情商 习惯等等 寓教于乐让小朋
  • java项目:基于springboot的商城系统(springBoot+mybatis+layui+jquery)1003

    项目描述 爱购商城 分为前端和后端两部分 主要功能包括 用户管理 轮播图管理 商品分类管理 商品品牌管理 商品管理 等功能 运行环境 jdk8 mysql IntelliJ IDEA maven 项目技术 springBoot mybati
  • 【C++11】 线程库的使用

    文章目录 1 线程库的基本使用 1 1 thread 1 2 this thread 1 3 线程函数参数 2 mutex 2 1 mutex的基本使用 2 2 mutex系列锁 2 3 lock guard与unique lock 3 原
  • 字符“&”在XML文件中需要被转义

    今天弄Mybatis的配置文件时 因为这样一条语句
  • Go 语言笔试面试题(并发编程)

    Q1 无缓冲的 channel 和 有缓冲的 channel 的区别 答案 对于无缓冲的 channel 发送方将阻塞该信道 直到接收方从该信道接收到数据为止 而接收方也将阻塞该信道 直到发送方将数据发送到该信道中为止 对于有缓存的 cha
  • 【Blender2.82a】学习记录

    Blender2 82a 学习记录 1 基本操作 1 1 界面操作 1 2 物体操作 1 3 建模基础 2021 12 13 最近的项目又要用到blender了 已经一年半没用过了 现在用的版本为2 93 6 尽管这篇记录的版本比较老了 但
  • 微信公众号开发本地调试方法

    前言 这几天一直想搞个公众号玩一玩 然后去阿里云买了个云服务器ECS 学生9 9 月 因为一开始接触云服务器 所以选了个window系统 然后在本地创建了一个简单的web项目 jyc 用来认证token 在云服务器里面搭了JDK和tomca
  • CMakeLists.txt指定GCC和g++版本号

    Centos默认的g 版本只有4 8 5一般需要升级g 版本 比如升级9 3 0 升级成功后再使用c 14会报unrecognized command line option std c 14 错误 由于有多个gcc版本 cmake使用的是
  • 向前走

    行脚僧云游山中 目力已经瞥见峰上那风化嶙峋的岩石 许是明日便能行至山顶 脚下不是山脉的主峰 但也是颇具险势 并非泛泛 篝火照耀面庞 在山洞的壁上投出巨大的身影 遁入空门近十载 离寺云游也两三个春秋了 原有些厌世 方才脱发出家 住持常言他有些
  • 「解码AGI 对话大模型」AGI创业者不能错过的五节课!

    由百度飞桨 文心大模型 BV百度风投联合主办 张江集团战略合作的AGI Foundathon 大模型创业松活动于9月11日全面上线 为了进一步提升开发者的创新能力和创业实力 主办方精心策划了全面的线上AGI创业营 本次创业营集创业辅导 技术
  • vue3-styled-components inject导致死循环

    npm vue3 styled components npm 低版本浏览器报错 chrome 49 Uncaught RangeError Maximum call stack size exceeded Vue warn Avoid ap
  • .net 和 java 技术对应关系

    net 和 java 技术对应关系 java 生态的优势早已人尽皆知 asp net core 的生态也呈欣欣向荣之势 作为高级技术从业人 你不应该落下任何一门技术 如果你正在将你的 java 知识体系同步到 net 或者正在将你的 net
  • T-Kernel Data types

    来自 uT Kernel 2 0 Specification 3 1 1 General Data Types typedef signed char B signed 8 bit integer typedef signed short
  • 项目-STL空间配置器

    这篇博客主要讲一下SGI STL中的空间配置器的工作流程 一 项目背景 小块内存带来的内存碎片问题 外碎片问题 小块内存频繁申请释放带来的性能问题 二 空间配置器的思想 对于我们来说 对new和delete很熟悉 这两个函数可以分别完成内存