五、C++内存管理机制 —— 分配器allocator(侯捷)

25 篇文章 10 订阅
订阅专栏

侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! !
一、C++ 面向对象高级开发
1、C++面向对象高级编程(上)
2、C++面向对象高级编程(下)
二、STL 标准库和泛型编程
1、分配器、序列式容器
2、关联式容器
3、迭代器、 算法、仿函数
4、适配器、补充
三、C++ 设计模式
四、C++ 新标准
五、C++ 内存管理机制
1、primitives
2、std::allocator
3、malloc/free
4、other allocators
5、loki::allocator
六、C++ 程序的生前和死后

五、C++内存管理机制 —— 分配器 allocator(侯捷)

  • 演变过程:
    • per-class allocator
    • static allocator
    • global allocator
  • 标准库分配器 std::allocator
    • VC6 的标准分配器
    • BC5 的标准分配器
    • GNU2.9 的标准分配器
    • GNU4.9 的标准分配器
    • GNU2.9 std::alloc

👉 该课程能让你:从平地到万丈高楼!—— 侯捷
👉 做到:心中自有丘壑!
💪 源码之前,了无秘密!

演变过程:

per-class allocator

  1. 为了减少malloc的次数,使用我们重载operator new(如下图右上角),一次挖一大块,然后当作linked list 串穿起来,什么时候用到,直接给就行:
  2. 降低cookie的用量,由于一次malloc就有两个cookie占用8个字节,会增加浪费率;
  3. 所以使用 内存池不仅可以加快速度(速度考虑)还能降低利用率(空间考虑)
    在这里插入图片描述

union : 借用同一个东西的前四个字节当作指针来使用,从而减少内存的膨胀。

在这里插入图片描述

delete没有使用 free没有将内存还给操作系统,但不是内存泄漏(还都在自己的手上)。
如果要还的话,技术难点会非常高,这件事后面再讨论。

在这里插入图片描述

static allocator

如果还是像上面那样,任何需要分配器的class都需要给它写一个版本,重复性动作太多了!!!
从软件工程的角度考虑,同样的东西应该把它集中到一个地方上去,这样将来如果改变也很方便,改一个地方就行了。

面向对象领域我们不喜欢全局的东西,所以可以将上面的动作operator new / delete抽取出来,放到一个class里面,这个class就叫做allocator

在这里插入图片描述

可以将allocator想象成一个指针,指向一个链表;意思是:每个class里面都有专门为自己服务的小型的static(静态的)allocator,这个allocator里面有一个单向链表

在这里插入图片描述

  • 这比先前的设计干净多了,application classes不再与内存分配细节纠缠不清,所有相关细节都让allocator去操心,我们的工作是让application classes正确工作。

还有一种偷懒的实现方式,就是把上图黄色的这些东西定义成

在这里插入图片描述

global allocator

而标准库的allocator如下,它有16个自由链表:

在这里插入图片描述

标准库分配器 std::allocator

不同的编译器所附带的标准库里头的分配器做法可能都不一样,以下是当时三种主流编译器里面所带的分配器!

VC6 的标准分配器

可以对比最新的Visual Studio !

  • VC6 的 allocator 只是以 ::operator new::operator delete 完成 allocate()deallocate(),没有任何特殊设计。

  • 如下图右上角,容器的第二个模板参数都是 allocator

  • 分配是以对象元素为单位

在这里插入图片描述

BC5 的标准分配器

  • 和VC6相同,没有任何特殊设计。

在这里插入图片描述

GNU2.9 的标准分配器

在这里插入图片描述

使用的是allocalloc是一个class

  • 使用里面的静态函数 alloc::allocatealloc::deallocate
  • 512个字节,没有元素单元!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GNU4.9 的标准分配器

同样,没有任何特殊设计,和VC6,BC5一样。这个文件中已经说明,这个分配器没有用,容器的分配器不使用它!

在这里插入图片描述
在这里插入图片描述

GNU2.9 std::alloc

为什么要把他放在最后讲?因为侯老师认为它设计得最好。它和GNU4.9中的 __pool_allocator 相同。

在这里插入图片描述
设计是内存池的思想。

  • 16个指针指向16条链表 【只服务大小为8 ~ 128字节的元素,超过128字节就调用malloc,就不归这个pool管理了】,每条链表分配不同大小的内存空间,从左往右每一条链表间隔8个字节。
  • 理论上是这样的,但是在代码实现的时候,是首先申请一个大的内存块,然后在大的内存块上进行切分,所以不同链表之间会有连线
  • 每个链表会申请 8 ∗ n ∗ 20 ∗ 2 8*n*20*2 8n202 字节的内存空间,n 代表第 n 条链表 【也就是每一个块的大小为 8 ∗ n 8 * n 8n 个字节】 ,20 表示将内存最多切分成20个子内存块 【根据这个设计团队的经验设定的】 ,2 表示会申请 2 倍大小的内存用于战备池。这些内存空间是cookie free的。

⭐️ embedded pointers

  • 嵌入式指针:借用人家的前四个字节,当作指针。
  • 下图的obj就相当于指针。

在这里插入图片描述

STL Allocator 内存分配全揭秘
谢谢大家的关注
02-28 1151
STL 容器都需要传入一个内存分配器 allocator,如果不指定,则使用默认 std::allocator 内存分配器std::allocator 旨在将内存分配和对象构造。本文基于 gcc-12.2 分析了 std::allocater 的实现。另外,也分析了对象拷贝函数std::copy() 和 std::fill() 函数的实现。
c++ allocator 实现
05-06
linux下c++ allocator 共享内存,内存池实现
C++内存管理Allocator的解析与理解
最新发布
richard_yuu的博客
07-31 669
Allocator作为C++标准库中的一个重要组件,为开发者提供了一种灵活且类型感知的内存分配方法。通过自定义Allocator,我们可以实现更加高效的内存管理策略,以满足特定性能和内存使用要求。在本文中,我们深入探讨了Allocator的基本概念、基本操作以及使用示例,并通过代码实例展示了如何在实际编程中使用Allocator进行内存管理。希望这些内容能对读者有所帮助。
C++ allocator
weixin_34125592的博客
05-10 244
说一说C++里的allocator。我们知道,C++ STL里定义了很多的容器(containers),每一个容器的第二个模板参数都是allocator类型。比方说在VC10里,vector类的模板声明为: template<class _Ty, class _Ax = allocator<_Ty> > class vector 但是,基本上很少有人会自定义一个all...
C++中的分配器allocator)帮助我们在动态内存管理中更加灵活地操作和控制。
Kegi_的博客
03-15 380
分配器适配器:分配器还支持分配器适配器的使用。分配器适配器是一种包装器,可以将普通的分配器转换为具有特定功能的分配器。总之,C++中的分配器是一种非常灵活和可定制的工具,可以帮助我们更好地管理内存分配和释放,以及对象的构造和析构过程。我们可以根据实际需求定制分配器的行为,以达到更高效和优化的内存管理。我们可以通过提供自定义的allocate()和deallocate()函数来指定特定的内存分配和释放行为。C++中的分配器allocator)是一种用于管理内存分配和释放的机制
Memory Analyzer (MAT) 使用
转载技术难题
09-14 1045
The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption. Use the Memory Analyzer to analyze productive heap dumps with hundreds of millions of objects, quickly calculate the
AllocatorC++语言标准库中最神秘的部分之一
lingdongdeshui的专栏
05-19 561
AllocatorC++语言标准库中最神秘的部分之一。它们很少被显式使用,标准也没有明确出它们应该在什么时候被使用。今天的allocator与最初的STL建议非常不同,在此过程中还存在着另外两个设计--这两个都依赖于语言的一些特性,而直到最近才在很少的几个编译器上可用。对allocator的功能,标准似乎在一些方面追加了承诺,而在另外一些方面撤销了承诺。 这篇专栏文章将讨论你能用allocat...
侯捷先生讲解C++内存管理:南京大学教案
"侯捷先生在南京大学的内存管理教案,涵盖了C++中的内存管理基础,包括内存原语、自定义new/delete、定位new/delete、数组new/delete、池分配、嵌入式指针、案例研究、STL中的allocator、Loki和MFC的小对象分配器...
C++内存分配详解一:分配工具概述
qq_34269632的博客
04-12 619
概述分析C++分配器、new系列工具和malloc的内存分配方式的不同;概述分析malloc所分配的内存空间的形式
侯捷解读:C++内存管理的MemoryPool策略与无痛实践
文章还涉及了freelist(自由列表)、freeblock(自由区块)、allocator分配器)等核心概念,这些都是理解内存管理背后的术语。 此外,文章深入剖析了SGI STL中的内存管理,特别是关于内存块的释放操作,分析了其...
std 源码剖析及 C++ 内存管理(二)
编程与实战的博客
09-01 2037
‍‍大家好,我是唐唐!本文关于 C++ 内存管理学习笔记自侯捷,上次笔记见C++ 内存管理(一)。1.各个标准分配器实现1.1 VC6.0 malloc在第一节中提到,malloc 的内...
C++ 内存管理 - std::allocator - 侯捷
qq_43142509的博客
06-29 1157
alloc
C++ allocator
Stay hungry, Stay foolish
01-06 853
C++ allocator类讲解
C++的空间分配器allocator
sinat_31608641的博客
07-24 4006
一、背景 在STL中,Memory Allocator 处于最底层的位置,为一切容器提供存储服务,是一切其他组件的基石。对于一般使用 STL 的用户而言,Allocator 是不可见的,如果需要对 STL 进行扩展,如编写自定义的容器,就需要调用 Allocator 的内存分配函数进行空间配置。 ......
c++ allocator
weixin_57165154的博客
04-15 1280
c++
c++11 动态内存管理-分配器std::allocator
qq_40788199的博客
09-16 3922
std::allocator 类模板是所有标准库容器所用的默认分配器 (Allocator) ,若不提供用户指定的分配器。默认分配器无状态,即任何给定的 allocator 实例可交换、比较相等,且能解分配同一 allocator 类型的任何其他实例所分配的内存。
C++allocator
Inc.Cool
10-27 287
allocator – 是一个模板 1.头文件 memory 2.作用:帮助我们将内存和对象构造分开, 它分配的内存是原始的、未构造的。 3.使用:由于allocator和vector 一样是一个模板, 所以, 当定义一个allocator对象,必须指明要分配的对象类型。 根据给定的对象类型恰当的分配内存和对齐位置 分配内存且未构造: allocator&amp;lt;string&amp;gt; a...
写文章

热门文章

  • Anaconda安装-超详细版(2023) 357132
  • Tensorflow-gpu保姆级安装教程(Win11, Anaconda3,Python3.9) 135219
  • 一文快速搞懂Nginx —— Nginx 详解 63309
  • 修改Docker默认镜像和容器存储位置(超详细!!!) 36700
  • Vscode中vue代码颜色插件 18095

分类专栏

  • 网络编程 11篇
  • 计算机网络 4篇
  • 音视频 1篇
  • 设计模式 2篇
  • 深度学习 3篇
  • 数据库 18篇
  • MySQL 8篇
  • redis 10篇
  • docker 6篇
  • C++ 25篇
  • java 79篇
  • LeetCode 315篇
  • python 11篇
  • 大数据 2篇
  • Linux 18篇
  • vue 10篇
  • js 15篇
  • springboot 7篇
  • 内网穿透 4篇

最新评论

  • Anaconda安装-超详细版(2023)

    伴我清酒᭄ꦿ: Anacond Navigator进去后Jupyter用不了是啥情况呀,各位表情包

  • Anaconda安装-超详细版(2023)

    weixin_43183563: 镜像源地址失效解决方法: 首先删掉旧镜像源:conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/tensorflow/linux/cpu/ 然后更换pip源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

  • Anaconda安装-超详细版(2023)

    2301_79795444: 还有一种可能就是冒号:记得要用英文输入法,中文的不行,你冒号后面会隔一段空白就是中文输入法输入的

  • Anaconda安装-超详细版(2023)

    11.17208: 你好,我的问题和你的也一样也是出现不是内部命令,请问你解决了吗

  • 一文搞懂 UML 类图!!!

    2301_76962792: 总结的真好 谢谢☺️

大家在看

  • Windows Server 远程桌面断开导致锁屏问题及解决方案 1
  • 足浴店+闸机+智能衣柜+门票系统一体化管理系统解决方案——未来之窗行业应用跨平台架构

最新文章

  • Linux 多线程开发
  • Linux 多进程开发(下)
  • Linux 多进程开发(上)
2024年14篇
2023年316篇
2022年107篇
2020年7篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的懒虫

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家上海季节性商场美陈有哪些潜江玻璃钢雕塑摆件批发水景玻璃钢彩绘雕塑中山玻璃钢卡通雕塑造型玻璃钢恐龙雕塑图片云浮玻璃钢动物雕塑销售电话中卫玻璃钢景观雕塑款式多样湖北桃子玻璃钢雕塑厂玻璃钢卡通雕塑北极熊郑州玻璃钢卡通雕塑佛山玻璃钢雕塑介绍宜春户外景观玻璃钢雕塑玄武春季商场美陈矿区玻璃钢雕塑厂家湛江玻璃钢卡通雕塑商家无极玻璃钢花盆好5月1日商场开业美陈云南城市标志玻璃钢雕塑姜堰玻璃钢雕塑玻璃钢雕塑现场萍乡佛像玻璃钢雕塑优势江苏拉丝玻璃钢雕塑便宜河南开业商场美陈价格景观标识校园玻璃钢景观雕塑报价户外玻璃钢人物雕塑产品介绍商场美陈培训教程邢台玻璃钢雕塑定制乌鲁木齐玻璃钢卡通雕塑山东玻璃钢雕塑哪家好松滋玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化