STL源码剖析-分配器 Allocator

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

分配器(Allocator)

分配器给容器用的,是一个幕后英雄的角色。分配器的效率非常重要。因为容器必然会使用到分配器来负责内存的分配,它的性能至关重要。
在这里插入图片描述

在C++中,内存分配和操作通过new和delete完成。

new中包含两个操作,第一步是使用operator new分配内存,第二步是调用构造函数;
delete中包含两个操作,第一步是调用析构函数,第二步是使用operator delete释放内存。

operator new() 和 malloc()

vc98

C++的内存分配动作最终都会回到malloc,malloc再根据不同的操作系统类型(Windows,Linux,Unix等)底层的系统API来获取内存

同时我们可以看到,malloc分配之后的内存块中不是只有数据,而是还包含了其它很多数据。这样容易联想到如果分配次数越多,那么内存中数据越零散,这些额外的数据开销就越大。

所以一个优秀的分配器,应当尽可能的让这些额外的空间占比更小,让速度更快。
在这里插入图片描述

VC6,BC5,GC2.9所带的标准库分配器源码分析

VC6

在这里插入图片描述

BC5

BC5的分配器与VC6没有本质区别。BC5的优点是他的分配器第二参数有一个默认值,让我们在调用分配器时方便了一些。
在这里插入图片描述

GC2.9

GC2.9自带的allocator也差不多
在这里插入图片描述
虽然GC2.9和上面也基本一致,但是它有额外声明不要使用这个标准库的分配器,同时这个标准库分配器没有被使用。它使用的分配器是自行修改的

GC2.9的分配器的效率提高思路

GC2.9使用的是一个叫alloc的分配器
1.内存空间简介
在这里插入图片描述
2.G2.9 分配器——alloc
malloc分配出的内存区块中需要有地方来存放这个内存区块的大小。然而对于同一个容器而言,它的内置类型应当是相同的,所以对于容器的分配器,我们可以对此作出优化。

alloc创建了16条单向链表用来存放数据。这些单向链表用来存放不同元素大小的数据。
当容器需要内存时,alloc先查看自己是否已经申请过了这个大小的内存,如果已经申请过了,那么就继续放在对应的单向链表尾部。否则再调用malloc向系统申请一块内存空间。具体可以查看这里【C++内存管理】G2.9 std::alloc 运行模式
它的优点就是,由于每个链表都只有一种大小的元素,那么对于这条链表上的每一个元素,我们就不必再单独使用内存空间来记录它的大小。从而节省了内存空间

#0所对应的节点连接的链表负责分配大小为8byte的子空间
#3所对应的节点连接的链表负责分配大小为32byte的子空间
以此以8byte的间隔向后类推
#15所对应的节点连接的链表负责分配大小为128byte的子空间

在这张图中可以看到很多看起来非常杂乱的连线,这个实际上是alloc的内存申请机制影响的,alloc在申请内存时会考虑之前剩余下来的内存余量(这里存在pool当中),如果有内存余量的话在下一次申请空间时,会将上一次分配剩下来的内存空间按照需要的大小进行切割并挂载到对应的节点上。如果上一次剩余的大小不足以划分,那么会将这个剩余的内存空间挂到与它相等的内存空间大小的节点上去,然后重新分配内存。

二级分配器

在这里插入图片描述

当需要一次性分配的内存超过了128byte,std::alloc()本身就不会为其服务,而会将这个需求转给其他函数去处理,这里我们会在后边剖析源码的时候去介绍

可是用户申请分配的空间可能并不会正好是8的倍数(通常都不是),这时,就会把他提升至最近的长度,并为其分配对应大小的内存块。

new运算分两个阶段

(1)调用::operator new配置内存;
(2)调用对象构造函数构造对象内容

delete运算分两个阶段

(1)调用对象析构函数;
(2)调用::operator delete释放内存
为了精密分工,STL allocator将两个阶段操作区分开来:
内存配置有alloc::allocate()负责,内存释放由alloc::deallocate()负责;
对象构造由::construct()负责,对象析构由::destroy()负责。
同时为了提升内存管理的效率,减少申请小内存造成的内存碎片问题,SGI STL采用了两级配置器
当分配的空间大小超过128B时,会使用第一级空间配置器;当分配的空间大小小于128B时,将使用第二级空间配置器。

第一级空间配置器直接使用malloc()、realloc()、free()函数进行内存空间的分配和释放,而第二级空间配置器采用了内存池技术,通过空闲链表来管理内存。
当然,alloc也可以直接作为第一级分配器。

STL源码剖析】总结笔记(4):幕后功臣--分配器allocator 00 写在前面 【STL代码剖析】总结笔记(3):vector初识 在前面对于vector的分析中,我们遇到了allocator template<class T,class Alloc=alloc> 分配器是贯穿所有容器的存在,即使我们在使用各个容器时并不会用到它,但在背后的空间配置都是分配器的功劳。 这次让我们读懂allocator的原理,帮助我们更好地理解STL。 01 malloc() 所有的分配在最终都会走到malloc() 在c++的层面上也就是operator new(), 阅读详情

相关推荐

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4833

STL分配器

分配器allocator实现 1. 在vc98中allocaters的实现 1.new调用malloc函数 2.allocate调用new函数 2.在BC5中allocator的使用 实现原理 3.G++2.9stl 1. 对allocator的使用(使用alloc) 注意 他有allocator但没有放入标准库里,而是使用了alloc 2.alloc的实现原理 设计了十六条链表,每一条链表负责某一个固定大小的区块, 为什么不建议使用分配器 分配器的申请的释放底层实现实现就是malloc和

qq_44004011的博客 916

CH340以及CH系列USB转串口驱动下载

在之前使用USB转串口时,很多时候大家可能会不知道去哪下载驱动,然后百度随便下载一个,但往往鱼龙混杂且版本不一,所以今天特意整理一下CH340驱动以及CH系列的官方驱动下载地址,方便大家进行下载也方便自己后期查找,所有链接皆指向官方下载链接,每次下载都可获取官方当前最新驱动。 CH340/CH341 Windows驱动下载链接:CH341SER.EXE下载链接 Linux驱动下载链接:CH341SER_LINUX.ZIP下载链接 Andr...

OIDCAT的博客 4万+

深入理解STL空间分配器(一): new_allocator

_new_allocatorC++标准中定义的分配器,仅对operator new和operator delete做简单封装;malloc_allocatorC++标准中定义的分配器,仅对std::malloc和std::free做简单封装;__mt_alloc:一种支持多线程的空间配置器(亦可单线程),可分配2的幂次方大小的内存块,该配置器可灵活调整,性能高(stl手册描述,个人未实测);bitmap_allocator:一种使用位图来区分内存是否分配的配置器;

红军不怕远征难,万水千山只等闲 1343

STL分析(二)分配器Allocator

STL 分配器 new和delete

janke114的博客 385

STL(一)空间配置器的实现

空间配置器内存分配和释放第一层配置器第二层配置器内存池分配回收总结 内存分配和释放 当我们 new 一个对象的时候,包含两个操作,首先 operator_new 分配内存,再调用构造函数构造对象内容 但我们 delete 一个对象的时候,同样先调用析构函数,再调用 operator_delete 释放内存 STL 将这个过程薄薄的包装了一下,实际上没优化 配置器定义于 中, 中又包含 <stl_alloc.h> <stl_construct.h> 内存配置由 alloc::all

朱骥伦的博客 655

一篇文章搞懂STL中的空间配置器allocator(原创,多图,易懂)

Table of Contents 0.引入 1.标准的空间配置器allocator 2.更为高效的空间配置器alloc 2.1----对象的构造与析构 2.1.1 对象的构造:::construct(); 2.1.2对象的析构:::destroy(); 2.2----内存的配置与释放 2.2.0 概述 2.2.1一级配置器:__malloc_alloc_template 2...

vjhghjghj的博客 4805

stl源码剖析pdf_STL源码剖析——allocator分配器(上)

写在前面最近在阅读候捷老师的《STL源码剖析》,阅读到空间配置器(allocator)这一章,觉得非常受用。这篇文章就当作自己的学习笔记,下面我会从头到尾梳理一遍 allocator 的重点和难点,希望对这方面不了解的读者看完后有所收获。什么是 allocatorallocator 有什么用?我们需要对 C++allocator 的堆内存接口调用顺序有个清晰的认识,如下图所示。a...

weixin_39816027的博客 711

stl源码剖析_STL源码剖析——allocator分配器(上)

写在前面最近在阅读候捷老师的《STL源码剖析》,阅读到空间配置器(allocator)这一章,觉得非常受用。这篇文章就当作自己的学习笔记,下面我会从头到尾梳理一遍 allocator 的重点和难点,希望对这方面不了解的读者看完后有所收获。什么是 allocatorallocator 有什么用?我们需要对 C++allocator 的堆内存接口调用顺序有个清晰的认识,如下图所示。alloca...

weixin_39918043的博客 298

源码剖析STL内存分配器 std::allocator,让你能硬刚面试官

本期主要讲解C++ STL中的内存分配器std::allocator及其特性萃取器__gnu_cxx::__alloc_traits。 为防止混淆,规定如下: allocator:泛指内存分配器,仅仅是一个术语。 std::allocator:是STL实现的内存分配器类std::allocator。 更多硬核知识,欢迎关注: __gnu_cxx::new_allocator C++的默认的内存分配器std::allocator,继承至__gnu_cxx::new_allocator。而 __gnu

loOK后端 2300

stl源码剖析_STL源码剖析——allocator分配器(下)

写在前面上篇文章写了如何实现一个简易的 allocator 空间配置器,这篇文章来讲讲 allocator 空间分配的内部机制。由于分配过多的“小型区块”会造成内存碎片问题,SGI 设计了双层级配置器,即第一级配置器和第二级配置器。图1 第一级配置器与第二级配置器第一级配置器第一级配置器以 malloc(),free(),realloc() 等 C 函数执行实际的内存配置、释放、重配置操作。如图 ...

weixin_39946996的博客 76

【2014-06-18】C++ STL读书笔记:allocator

STL源码剖析》读书笔记,深入分析SGI STL的内存分配器allocator实现,包括一级配置器(malloc)和二级配置器(内存池)的源码结构和工作原理。

cstriker1407的专栏 74

C++ STL中的allocator

STL allocator剖析

T_T233333333的博客 1208

STL 源码剖析allocator 深入(五)

此时感悟:在夜深人静的时候,感谢自己可以思考,可以成长。 今天在学校,看到了即将要来的招聘会,我知道,现在的自己必须面对现实,因为只有你得到了,才会留下来! 声明:参考书籍侯杰 stl 源码剖析 第二章,比较详细的简述了allocator,我在上面一篇也有简单的介绍!由于今天在看源码有很多 不解,所以特此来总结和学习。 allocator 概述 标准allocator需要

SelfImprovement 1431

STL内存管理(二)

1. 背景 前些天在一个技术分享会上,某大牛说,STL使用了内存池,释放内存的时候,并不释放给OS,而是自己由留着用。 听到这些观点后,我就有些着急了,因为我以前一直是直接使用STL的一些工具类的,比如std::string、std::map、std::vector、std::list等等,从来都没有关注过内存的问题。 带着内存的问题,我花了两三天的时间去阅读STL的代码,并且写一些简单的程

wei.zhou的专栏 715

STL中的空间配置器allocator实现原理及源码剖析

allocatorSTL为自己的模版容器所设计的标准空间配置器。处于std命名空间下 今天我要讲的的allocator源码在我的github上,地址为 mySTL 是我模仿标准STL写出的代码,并添加了注释。allocator简介allocator为一个模版类,我们使用的时候一般都会将其绑定到一个具体的类型上。如下:allocator<int> alc;allocator大致需要实现如下功能:

我的大学 4086

STL源码剖析(侯捷版本) —— 第二章 空間配置器 allocator(一)

STL 的使用中,空间配置器是用户“不需要关注”的部分。它始终隐藏在 STL 组件(如容器)的背后,默默完成内存分配和管理的任务。用户使用 STL 容器时,很少直接接触空间配置器的细节。STLAllocator 是一个标准化的内存分配接口,定义了类型别名、内存分配与释放,以及对象构造与销毁的功能。它通过泛型和嵌套类型支持不同对象类型的内存管理,是 STL 容器内存操作的核心工具。allocator::value_type:分配的对象类型。

weixin_42255569的博客 1713

stl源码剖析_STL源码剖析 阅读笔记(二)allocator

一、空间分配器 allocator从使用上看,空间分配在任何语言的任何组件都不需要我们去过多关心,因为语言、组件的底层肯定都比较完整的做了这件事情。从实现上看,学习 allocator 的原理在源码学习中是首当其冲。因为没有空间分配,则无从谈起对象创建。这里说是空间分配,而不是内存分配,是因为也可以在内存之外的地方(如硬盘)分配空间。分配器主要作用就是分配空间,根据规范,其需要实现一些接口,完成一...

weixin_39633917的博客 206

关于STL allocator

关于STLallocator的接口与实现C++标准有比较清楚的定义:allocator wiki 1. SGI STL版本的allocator并没有遵守C++标准。它只提供simple_alloc类共container使用,设计的allocator名字叫做alloc,有二级配置器。第一级配置采用malloc/free来实现allocate/deallocate,第二级配置器采用针对

zeroom的技术专栏 8334

C++ 分配器 allocator

C++编程中,分配器(英语:allocator)是C++标准库的重要组成部分。C++的库中定义了多种被统称为“容器”的数据结构(如链表、集合等),这些容器的共同特征之一,就是其大小可以在程序的运行时改变;为了实现这一点,进行动态内存分配就显得尤为必要,在此分配器就用于处理容器对内存的分配与释放请求。换句话说,分配器用于封装标准模板库(STL)容器在内存管理上的低层细节。默认情况下,C++标准库使...

qilimi1053620912的博客 4220
上一篇: STL源码剖析-六大部件, 部件的关系,复杂度, 区间表示
下一篇: 刷题记录|Day57 ● 647. 回文子串 ● 516.最长回文子序列
null_one
博客等级 码龄8年 846粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值