揭秘——STL空间配置器

2023-10-26

为什么要有空间配置器呢?这主要是从两个方面来考虑的。
1、小块内存带来的内存碎片问题
  单从分配的角度来看。由于频繁分配、释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请求,但是这些空闲的块都不连续,导致任何一个单独的空闲的块都无法满足这个请求)。
2、小块内存频繁申请释放带来的性能问题。
  关于性能这个问题要是再深究起来还是比较复杂的,下面我来简单的说明一下。
  开辟空间的时候,分配器会去找一块空闲块给用户,找空闲块也是需要时间的,尤其是在外碎片比较多的情况下。如果分配器其找不到,就要考虑处理假碎片现象(释放的小块空间没有合并),这时候就要将这些已经释放的的空闲块进行合并,这也是需要时间的。
  malloc在开辟空间的时候,这些空间会带有一些附加的信息,这样的话也就造成了空间的利用率有所降低,尤其是在频繁申请小块内存的时候。
 为了解决上面这些问题,所以就提出有了内存池的概念。内存池最基本的思想就是一次向heap申请一块很大的内存(内存池),如果申请小块内存的话就直接到内存池中去要。这样的话,就能够有效的解决上面所提到的问题。
下面我们来剖析一下STL里面的空间配置器(SGI版)。
   STL里面的空间配置主要分为两级,一级空间配置器(__malloc_alloc_template)和二级空间配置器(__default_alloc_template)。在STL中默认如果要分配的内存大于128个字节的话就是大块内存,调用一级空间配置器直接向系统申请,如果小于等于128个字节的话则认为是小内存,则就去内存池中申请。一级空间配置器很简单,直接封装了malloc和free处理,增加_malloc_alloc_oom_handle处理机制。二级空间配置器才是STL的精华,二级空间配置器主要由memoryPool+freelist构成。
一级空间配置器:
执行流程:
 SGI以malloc来配置内存。当malloc()失败后,就调用oom_alloc(),如果客户端没有设置内存不足处理机制,则就直接抛出bad_alloc异常信息,或者直接终止程序。如果客户端设置了内存不足处理机制,则他就会一直调用内存处理机制,企图在某次调用之后获得一块足够的内存。但是如果内存不足处理机制设计不好的话,存在死循环的危险。
注意:"内存不足处理机制"是客户端的责任,设置"内存不足处理介质"也是客户端的责任。
程序:
typedef void(*MALLOCALLOC)();           //将void (*)()   重命名成MALLOCALLOC
template<int inst>
class _MallocAllocTemplate
{
private:
       static void* _OomMallo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

揭秘——STL空间配置器 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • NodeJS 获取指定时区的时间

    获取指定时区的时间 param offset 时区 returns Date 指定时区的 时间信息 module exports getZoneTime offset gt 取本地时间 let localtime new Date 取本地毫
  • mac下的readelf和objdump

    本文转载至 http www cnblogs com zlcxbb p 6059517 html ELF文件包括 1 可重定位的目标文件 2 可执行的目标文件 3 可被共享的目标文件 可以用file命令来看目标文件是否是ELF文件 在lin
  • matlab2018求多元函数驻点,机械优化设计课后习题答案.doc

    第一章习题答案 1 1 某厂每日 8h制 产量不低于1800件 计划聘请两种不同的检验员 一级检验员的标准为 速度为25件 h 正确率为98 计时工资为4元 h 二级检验员标准为 速度为15件 h 正确率为95 计时工资3元 h 检验员每错
  • 笔记:java、android网络交互频繁gc

    背景 纯手写没用三方异步方式网络通讯 现象 execute 之后log出现大量gc 内存总体没有多大变化 频繁出现的gc导致UI等待界面卡顿也着实吓了我一跳 解决思路 1 断点调试跟踪了一下发现是execute的问题 因为其他交互没有出现过
  • 信息学竞赛中的时间复杂度以及算法内容

    信息学竞赛一般的时间限制是1秒或2秒 在这种情况下 C 代码中的操作次数控制在 1 0 7 1 0 8 10 7 10 8 107
  • score-based generative models (Yang Song) 笔记

    20220524 Yang Song s blog 文章目录 20220524 方法 方法 The score function score based models and score matching Fisher divergence
  • Mybatisplus报错@TableId can‘t more than one in Class解决方案

    Mybatisplus报错 TableId can t more than one in Class解决方案 问题背景 解决方案 Lyric 能不能原谅我 问题背景 Caused by org springframework beans f
  • 安装es-header插件

    1 官网下载https github com mobz elasticsearch head 2 解压 3 进入解压目录 调出cmd窗口 确定自己已经安装了node 如下确定 没有自行下载安装 4 输入前端包安装命令 等待几分钟下载 npm
  • 在android中opencv视频采集,【Android】【opencv】实现摄像头拍照和录像

    1 0 需求 在安卓开发板上实现视频监控功能 并能后台监控 由于后期可能跑视频识别 所以考虑用OpenCV实现 通过OpenCV Manager进行动态库的链接 实现帧的预览和保存 android版本 5 0 1 开发平台 Android
  • 1、VScode汉化以及如何设置跳转到函数定义

    一 汉化 1 首先打开软件 软件默认是英文配置状态 如图所示 2 使用快捷键 Ctrl Shift P 进入如下界面 3 然后在弹出的界面中 输入 configure language 然后选择 install additional lan
  • CocosCreator在电脑Web打印vConsole日志的问题

    忘了什么时候开始 Web端的日志打印的文件输入信息全是vconsole min js文件 很纠结啊有木有 完全不知道日志的出处 日志输入如以下图片 官方还没有给出对于这个问题的配置是怎么样解决的 所以我们自己搞定 我们进入CocosCrea
  • [linux kernel] 内核下RX8025对接系统时钟

    系统版本 Ubuntu18 04 64 编译器版本 gcc version 7 4 0 Ubuntu Linaro 7 4 0 1ubuntu1 18 04 1 uboot版本 2018 07 linux4sam 6 0 板子型号 at91
  • [JavaWeb] 登录页面记住密码,账号或密码错误

    个人主页 沫洺的主页 系列专栏 JavaWeb专栏 JavaSE专栏 Java基础专栏 vue3专栏 MyBatis专栏 Spring专栏 SpringMVC专栏 SpringBoot专栏 Docker专栏 Reids专栏 MQ专栏 Spr
  • 区块链概念介绍

    区块链定义 区块链是一些技术集成的 适用于多方博弈 由多方共同对数据背书的数据存储工具 区块链的核心技术包含块链式存储 点对点通讯 密码学 共识机制 智能合约等 区块链是利用块链式数据结构来验证与存储数据 利用分布式节点共识算法来生成和更新
  • myBatis的xml大于小于不等于模糊查询

    and o create time lt endTime jdbcType TIMESTAMP 小于 and o create time gt startTime jdbcType TIMESTAMP 大于 and i status fla
  • Multimedia Tools and Applications(MTAP)期刊投稿经验分享

    Multimedia Tools and Applications ISSN号 1380 7501 2022年影响因子 2 577 出版社 Springer US 学科分类 计算机科学 工程技术 中科院4区 JCR Q2 CCFC 我投递的
  • 达芬奇无法播放视频,黑屏,不能预览画面

    说一下其中一个原因 是因为用了像是xdisplay super display这类软件 他们会安装一个显卡驱动而这个驱动就会导致这个问题 方法很简单 在设备管理器里面 显示卡一览 卸载掉除了你的电脑显卡以外的虚拟显卡驱动
  • element ui 中table表格刷新、input输入框添加enter触发搜索、连续点击的处理办法

    8 25小结 1 table表格刷新 elementy ui有一个v loading 我们可以给它绑定一个布尔值 truer就是转圈圈 false就是停止转圈圈 在刷新按钮上绑定一个事件来控制这个布尔值的改变 但是需要加一个定时器才能看出来
  • spring-boot-maven-plugin爆红解决方案,亲测有效

    报错信息提示如下 Plugin org springframework boot spring boot maven plugin not found 我使用idea中的spring initialer 来创建的 maven项目 但是在下载
  • 揭秘——STL空间配置器

    为什么要有空间配置器呢 这主要是从两个方面来考虑的 1 小块内存带来的内存碎片问题 单从分配的角度来看 由于频繁分配 释放小块内存容易在堆中造成外碎片 极端情况下就是堆中空闲的内存总量满足一个请求 但是这些空闲的块都不连续 导致任何一个单独