STL的空间配置器

SGI STL原代码分析之Vector(一)。 STL版本有很多种,STL是一套泛型编程框架标准,只要实现了这套标准的东西,都是叫做STL。。  所以STL有很多版本, 但是SGI STL是最为标准,而且是STL之父写的所以是最为权威的STL模板。 目的:分析Vector构造到Push_back这一系列过程中,STL中的实现过程。 开干。。。~!!!! 首先来到Vector这个类,Vector模板里面传递了两个参数,第一个是 阅读详情

这篇博客主要讲一下SGI-STL中的空间配置器的工作流程。我自己实现模仿STL实现了一个空间配置器,并且用两个容器list和vector测试使用了空间配置器。

这里只给出模型,如果要看源码,点击打开链接下载。源码中的注释比较多,也比较全。

下面是工程目录: 
这里写图片描述

现在介绍一下工程目录:

  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里面是主要是一些拷贝、填充类的函数,这个在Vector中用的比较多;
  7. Main.cpp是测试文件,用来测试两个容器的接口和内存池实现正确与否。

下面这幅图主要是空间配置器的框架:

这里写图片描述

我们对比上面这幅图从下往上讲:

int *pi1 = SimpleAlloc<int, Alloc>::Allocate(100);    // * 申请一个有100个元素的整型数组
int *pi2 = SimpleAlloc<int, Alloc>::Allocate();       // * 申请一个整型

SimpleAlloc<int, Alloc>::Deallocate(pi1, sizeof(int) * 100);
SimpleAlloc<int, Alloc>::Deallocate(pi2);

第一行语句申请了有100个整型元素的数组,那就是申请了 sizeof(int) * 100 == 400个字节的空间。由于400大于128,二级空间配置器会转去找一级空间配置器去申请,二级空间配置器之后就不管申请空间的事了。一级空间配置器直接用malloc向操作系统申请了400字节的空间(能不能申请成功就是另一回事了,在一级空间配置器的代码中其实设置了用户自定义的函数指针,如果malloc失败,就会调用这个函数指针所指的函数,该函数会做一些事,让操作系统收回一些内存,然后会再次malloc,直至成功)。

第二行语句是申请了一个整型的空间,二级空间配置器发现sizeof(int) == 4字节,是小于128字节的,那空间配置器就会在自由链表中找到4字节对应的下标(其实自由链表是没有4字节的内存块的,那就把它定位到足够满足4字节的最小的内存块,即8字节),所以下标定位到0,即在free_list[0]中找内存。 刚开始时,自由链表为空,并没有内存块,那就去找内存池要,要多少呢?要 20*8个字节,这时候发现内存池刚开始也没有内存,这时候就会去找操作系统申请内存,申请了20 * 8 == 160个字节(其实内存池是向操作系统申请了 2 * 160 == 320字节的空间,但是只返回20个对象的大小即160字节给自由链表,剩下的160字节留在了内存池中),就把最开始的8个字节返回给应用程序,剩下的152字节正好够19个整型对象的空间,就把这些空间挂接到自由链表的0号下标下。

第三行是释放申请的400字节,直接由一级空间配置器free掉,还给操作系统;

第四行是释放pi2所指向的8个字节,直接还给自由链表,并不还给操作系统。(其实有二级空间配置器申请的内存释放时都不会还给操作系统,而是还给自由链表,内存池和自由链表的内存都是到程序结束时才归还给操作系统)。

内存池优缺点:

  1. 优点 
    对于频繁地申请小块内存,减少了申请的时间。
  2. 缺点 
    由于自由链表的内存块大小不连续(8、16、24 …),导致了内部碎片的产生。这使得内存利用率不高。 
    小块内存释放之后,并没有归还给操作系统,而是放到了自由链表中,会导致系统内存越来越少,除非到程序结束,否则内存不会归还给操作系统。

SGI STL空间配置器源码刨析 SGI STL空间配置器源码刨析 SGI STL一级空间配置器和二级空间配置器,一级allocator采用malloc和free管理内存,二级是基于内存池实现的。 SGI STL 对于容器空间配置器选择 template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > class vector; 对于vector使用... 阅读详情

相关推荐

SGI—STL(SGI C++ 标准程序库)源码+文档

STL的sgi(Silicon Graphics Computer System,Inc) 版本,同时也是声名最盛的一个STL版本,该版本被纳为GNU C++标准程序库。

C++———STL(SGI版本)

什么是STL? STL (standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,更是一个包罗数据结构与算法的软件框架。 STL包含六大组件:容器、仿函数、算法、迭代器、空间配置器、配接器。 STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。 迭代器(itorator) 是一种设计模式(元素访问的一种设计模式),所有容器都需要遵循相同的设计规范。好处就在于每个容器

weixin_45302844的博客 1494

SGI STL源码.zip

SGI STL的源代码,【免费下载方式】请查阅文章中的介绍:https://dongshao.blog.youkuaiyun.com/article/details/103506895

C++ STL : SGI-STL空间配置器源码剖析

文章目录空间配置器的概念SGI-STL空间配置器一级空间配置器二级空间配置器申请空间补充内存块从内存池中索要空间空间回收内存碎片外碎片内碎片空间配置器的再次封装 空间配置器的概念 空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收) 的,在默默地工作。 在之前所有模拟实现的容器中,对于空间的管理都是通过直接调用new和delete来进行的,虽然代码可以正常运行,但是还是存在着大量的缺点。 空间申请与释放需要用户自己管理,容易造成内存泄漏 频繁向系统申请小块内存块,容易造成内存碎片 频繁

凌桓丶的博客 1656

海量数据 / Vastbase 深度研究笔记 v3.1

v3.1 重点修订:在 v3.0 审慎版基础上,新增“2026 新变量”章节,纳入 7 亿级定增、HTAP / 多模态时序数据库、G100 V3.0 Build 8 的 3CM+2DN 高可用补强、pgvector / V100 / AI 多模叙事,以及集成服务基因与标准软件 ARR 的拉扯。核心关注点是:Vastbase 能否把 openGauss 生态红利、数据库产品矩阵和行业交付能力,转化为可持续、可复购、低边际成本的标准软件收入。海量不是没有业务基本盘,也不是马上失血致死;客户越多,服务债越大。

喝醉酒的小白 556

12V转5V稳压电路详细分析(7805三端稳压,LM2596稳压)

7805线性三端稳压 DCDC的意思是直流变到直流(不同直流电源值的转换),只要符合这个定义都可以叫DCDC转换器,或称之为开关电源或开关调整器。 7805属于常用的线性三端稳压器,输入电压范围不大于35V,输入输出压差2V,最大输出电流1.5A,下图为原理图,其原理简单,使 用方便,深受很多用户的喜爱。但是其不足之处就是效率低,特别是压差越大时其效率越低。比如这里12V转5V的效率为 5V/12V≈41.7%。 如上电路是最经典的7805稳压5V电路,电路中有两个电容,电容的作用如下: ...

a2001444的博客 9万+

【C++】SGI-STL(空间配置器)

本篇博客整理空间适配器的相关知识和部分实现代码,旨在让读者更好地理解STL的设计和功能。

NeeEk0的博客 1235

利用HipSTR从二代测序数据中精准解析短串联重复序列(STR)的遗传多态性

本文详细介绍了如何利用HipSTR工具从二代测序(NGS)数据中精准解析短串联重复序列(STR)的遗传多态性。通过三步走策略,HipSTR能够高效识别STR区域、估算重复次数并判定基因型,适用于法医鉴定、疾病研究和细胞系鉴定等多个领域。文章还提供了实战操作指南和常见问题解决方案,帮助研究者充分利用NGS数据开展STR分析。

weixin_28702105的博客 482

【C++】STL之空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。

fight_p的博客 2833

CTFshow-CRYPTO(持续更新)

密码学签到 }wohs.ftc{galf 将字符串逆序即可 letters = '}wohs.ftc{galf' a = list(letters) a.reverse() for letters in a: print(letters,end='') crypto2 打开浏览器的控制台,复制粘贴回车即可得到flag crypto3 这一题同上 crypto4 如图填写即可,一开始e填写的是17,一直回答错误,后来经过群内大佬提醒软件的e是十六进制的,17转十六进制就是0x11 cr

i_kei的博客 1万+

基于Java+Maven+Testng+RestAssured+Allure+Jenkins搭建一个接口自动化框架

2、有一个提取表达式列,通过编写每个接口的JSON提取表达式,后边在解析Excel时,对接口执行后的响应数据用该表达式提取出来,保存到环境变量,如果某些接口需要前置接口的响应数据,我们就可以从环境变量中获取该数据出来,从而解决了接口关联的问题。1、在之前介绍过全局配置类Contants中添加一个控制台日志开关控制权限,如果选择为false,则控制台不输出日志,将日志输出到allure报表,选择为true,则在控制台输出日志,不输出到allure报表。

专注于技术分享的博主 1183

【C++】STL 之空间配置器 | STL 总结

本篇博客主要讲解了 STL 的空间配置器、定长内存池与 malloc 的效率对比以及 STL 六大组件内在联系的总结等等。

joy.728的博客 2705

c语言串口编程详解

串口: 一种异步通信接口,通常用于低速数据传输。RS-232: 最常见的串口标准,定义了电气特性、连接器和信号线。UART: 通用异步收发传输器,是实现串口通信的硬件模块。通过以上内容,你应能够理解并实现C语言在Windows和Linux平台上的串口编程。希望这本手册能帮助你在实际项目中顺利进行串口通信开发。如果有任何疑问或需要进一步的帮助,请随时提问。

jkzyx123的博客 2224

STL——空间配置器

目录 前言 一.概念 二.优点 三.空间配置器原理 3.1 一级空间配置器 3.2 二级空间配置器 3.2.1 内存池技术 3.2.2 哈希桶技术 四.内存碎片问题 4.1 外碎片 4.2 内碎片 五.具体细节 5.1 申请空间 5.2 填充内存块 5.3 向内存池中索要空间 前言 我们知道STL容器在不断保存...

weixin_57023347的博客 3201

VSCode连接SAP ABAP开发环境

本文介绍了使用VSCode连接ABAP开发环境的详细步骤。首先通过SICF或SMICM事务码获取ABAP连接地址,然后安装ABAP remote filesystem插件。提供了两种创建连接的方法:通过命令面板逐步配置(输入服务器地址、账号、系统标识等)或直接编辑JSON配置文件。最后通过命令面板选择已创建的连接即可完成连接,连接成功后可在VSCode左侧工作区查看ABAP系统内容进行开发。JSON配置方式更为简便推荐。整个流程帮助开发者摆脱复杂的Eclipse配置,实现快速便捷的ABAP开发环境搭建。

weixin_45293769的博客 2214

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1899

【C++】STL空间配置器

容器,算法,迭代器, 空间配置器,适配器,仿函数。为各个容器进行高效的内存管理(内存的申请与回收)的。

一点一点变好 1526

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

揭秘——STL空间配置器

为什么要有空间配置器呢?这主要是从两个方面来考虑的。 1、小块内存带来的内存碎片问题   单从分配的角度来看。由于频繁分配、释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请求,但是这些空闲的块都不连续,导致任何一个单独的空闲的块都无法满足这个请求)。 2、小块内存频繁申请释放带来的性能问题。   关于性能这个问题要是再深究起来还是比较

Sunnylunch-blog 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

STL空间配置器学习

2301_77509762的博客 1385

STL空间配置器allocator详解

stl六大组件简介我们知道,stl有容器,空间配置器,适配器,迭代器,仿函数以及算法这6个组件,它们六者关系大概如下:容器通过配置器取得数据存储空间,算法通过迭代器获取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以修饰或套界仿函数。侯捷在《STL源码剖析》一书讲到:因此我们需要先去学习空间配置器。预备知识一般来说,我们习惯的C++内存配置和释放操作是这样的:class A {}; A*

xy913741894的博客 1万+

STL中的空间配置器

STL中的空间配置器 文章目录STL中的空间配置器1. 什么是空间配置器2. 为什么需要空间配置器3. SGI-STL空间配置器实现原理3.1 一级空间配置器3.2 二级空间配置器3.1 内存池3.2 SGI-STL中二级空间配置器设计3.3 SGI-STL二级空间配置器之空间申请3.3 空间配置器的默认选择3.4 空间配置器的再次封装3.5 对象的构造与释放4. 与容器结合5.总结 1. 什么是空间配置器 空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。 2. 为什么

wolfGuiDao的博客 851

【C++】STL之空间配置器(了解)

什么是空间配置器。

Elena's Blog 2101

C++的STL之空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。

ZerO_on的博客 742
上一篇: 文件压缩项目
下一篇: phtread_mutex的初始化
Everlasting2016
博客等级 码龄11年 22粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值