带你了解STL空间配置器运作方式

机器学习【学校智慧食堂及其应用】 本文主要介绍机器学习【智慧食堂及其应用】 阅读详情

在STL运用中,空间配置器总是隐藏在一切组件(各种容器container)的后面,默默付出。所有STL操作的对象都是存放在容器中的,而容器所需要的空间的申请释放等,正是它在幕后的工作。

1. 建立空间配置器的认知框架:

空间配置器提供给使用者统一的接口(空间申请,构造对象,析构对象,释放空间)
我们先通过自己简化的一个不很标准但却能以小见大的的简单空间配置器入手介绍:

#ifndef _MEMORY_H   //编译器控制语句,用于防止重复编译
#define _MEMORY_H
//第一个关键函数,申请_N个_Ty类型的空间(模板函数)
template<class _Ty>
_Ty *_My_Allocate(ptrdiff_t  _N, _Ty *){
    if (_N < 0)
        _N = 0;
    return ((_Ty*)operator new((size_t)_N * sizeof (_Ty))); }
//第二个关键函数,在指定空间上构建对象(使用定位new)
template<class _T1, class _T2> 
void _My_Construct(_T1 *_P, const _T2& _V){
    new((void *)_P) _T1(_V);  //placement new}
//第三个关键函数,对象的摧毁即析构,通过去调用对象自己的析构函数析构对象,之后再对空间进行回收
template<class _Ty>
void _My_Destroy(_Ty  *_P){ 
    _P->~_Ty();}
//当然C++会以类去构建配置器(一切皆对象嘛!)使用它的方法全在内部封装提供
template<class _Ty>
class my_allocator {
public:
    typedef size_t        size_type;
    typedef ptrdiff_t     difference_type;
    typedef _Ty*          pointer;
    typedef const _Ty*    const_pointer;
    typedef _Ty &         reference;
    typedef const _Ty &   const_reference;
    typedef _Ty           value_type;//这些type的设计理由先不用关心,其实是为了萃取,后续博客会提到相关内容

    pointer address(reference _X) const//此接口用于返回某个对象的地址
    {return (&_X); }
    const_pointer address(const_reference _X) const
    {return (&_X); }
    //类中去申请空间的接口函数,相信大家也明白了上面函数的作用之处了
    pointer allocate(size_type _N, const void *){
        return (_My_Allocate((difference_type)_N, (pointer)0));  }
    char* _Charalloc(size_type _N){//特定类型,直接申请相应字节大小空间
        return (_My_Allocate((difference_type)_N,(char *)0));   }
    void deallocate(void  *_P, size_type){//回收空间函数接口
        operator delete(_P); }
    void construct(pointer _P, const _Ty& _V){//申请空间后去构造对象的接口
        _My_Construct(_P, _V); } 
    void destroy(pointer _P)//析构对象接口
    {
        _My_Destroy(_P); 
    }
    size_t max_size() const//可最大配置的空间
    {
        size_t _N = (size_t)(-1) / sizeof (_Ty);
        return (0 < _N ? _N : 1);
    }
};

2.SGI空间配置器介绍

相必你会说,上面所写的简单空间配置器不就是对malloc delete 定位new和析构的一个简单封装吗?没错上面的代码何谈效率,就是一个简单封装,想让大家明白空间配置器的基本思路,而接下来我没们要去看看SGI空间配置器,你会为它的精彩叹息!
STL标准告诉我们,配置器定义于之中,SGI中,包含两个头文件:stl_alloc.h //负责对内存空间配置和释放
stl_construct.h //负责对象的构造和析构

我们会就内存释放配置作主要介绍stl_alloc.h,主要是向system heap要求空间,并考虑多线程情况,考录内存不足时的处理情况和过多小区块可能造成的内存碎片(fragment)。
它所以设计了双层配置器,第一级空间配置器直接使用malloc()和free()完成,第二级配置器则视情况采用不同的策略,当配置区块大于128bitys时认为足够大,便使用第一级空间配置器,相反则使用第二级空间配置器以降低负担,采用memory pool整理方式。

#ifdef __USE_MALLOC
...
typedef __malloc_alloc_template<0> nalloc_alloc;
typedef malloc_alloc alloc;//令alloc为第一级空间配置器
# else
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc 
//令alloc为第二级空间配置器
#endif
//其中__malloc_alloc_template为第一级空间配置器,__default_alloc_template为第二级空间配置器

//但无论alloc被定义为第一级空间配置器还是第二级,SGI还为它包装了一个接口如下,使得配置器接口符合标准(只是简单的转调用,但调用传给的可能是第一或第二级空间配置器,而所有使用它的容器都通过此接口使用):
typedef __malloc_alloc_template<0> malloc_alloc;
template<class T, class Alloc>
class simple_alloc {

public:
    static T *allocate(size_t n)
                { return 0 == n? 0 : (T*) Alloc::allocate(n * sizeof (T)); }
    static T *allocate(void)
                { return (T*) Alloc::allocate(sizeof (T)); }
    static void deallocate(T *p, size_t n)
                { if (0 != n) Alloc::deallocate(p, n * sizeof (T)); }
    static void deallocate(T *p)
                { Alloc::deallocate(p, sizeof (T)); }
};     

容器使用时方式大概如下:

template < class T,  class Alloc = alloc >//缺省使用alloc为配置器
class vector{
protected:
    typedef simple_alloc< value_type, Alloc>data_allocator;
    void deallocator::deallocator(start, end_of_storage - start);
    ....
};

我们先对STL空间配置器有一个框架认识,并对它的一二级空间配置器运作方式有个了解,下一篇将会对一二级空间配置器作深入代码剖析。

Faster Planner——Kinodynamic Astar详解 实际成本和启发式成本 实际成本 Actual Cost   每条轨迹的真实代价函数定义如下: J(T)=∫0T∥u(t)∥2dt+ρT \mathcal{J}(T)=\int_{0}^{T}\|\mathbf{u}(t)\|^{2} d t+\rho T J(T)=∫0T​∥u(t)∥2dt+ρT 离散形式下: 启发成本 Heuristic Cost pμ∗(t)=16αμt3+12βμt2+vμc+pμc=pμc+vμc+T2∗((2∗vμc−2∗vμg)/(2∗T)−(6∗pμc−6∗pμg+6∗T∗v 阅读详情

相关推荐

2.6 SST的核心性能指标体系

本文构建了固态变压器(SST)的核心性能指标体系,涵盖电气性能、可靠性、经济性和环境适配性四大类指标。电气性能指标包括运行效率(≥97%)、功率密度(≥900kVA/m³)、谐波畸变率(≤3%)等关键参数;可靠性指标设定MTBF≥43800h、年均故障率≤1.2次/年等标准;经济性指标对比分析了初始购置成本(45-55万元)和全生命周期成本(48-55万元);环境适配性指标则明确了温度、海拔等工况要求。该体系采用量化公式和国标限值,为SST的性能测试、选型和优化提供了统一标准。

技术工作者 597

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

对称加密和非对称加密,数字签名和证书

在对称加密中,任何人都可以使用公钥进行加密。在数字签名中,任何人都可以使用公钥验证签名。数字签名,其实就是将非对称加密反过来使用。公钥私钥非对称加密发送者加密时使用接收者解密时使用数字签名验证者验证签名时使用签名者生成签名时使用谁持有密钥?只要有需要,任何人都可以持有个人持有既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密。公钥负责加密,私钥负责解密。既然是签名,那肯定是不希望有人冒充我发消息,所以只有我才能签名。私钥负责签名,公钥负责验签。

m0_70432049的博客 1409

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

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

joy.728的博客 2705

C++(Qt)软件调试---Windows下Qt使用dump定位崩溃位置(1)

在C++/Qt程序崩溃时,往往很难找到崩溃的原因,如果是稳定复现的问题还好,但是多数情况遇见的问题是随机出现的,这时想要快速找到问题并解决就需要通过dump文件定位崩溃位置。

mahuifa的博客 1万+

【零基础学习CAPL】——弹窗信息提示

不用手动制作Panel窗口,直接使用CAPL脚本实现弹窗提示。//没有wait超时,等待测试人员确认//有wait超时,对话框在超时后自动终止//有wait超时,可以显示一个资源,即对话框可以显示额外的信息。/*参数说明text:显示在弹窗中的内容,长度限制在4096字符timeout:弹窗自动结束的时间,单位:ms。若为0,则无超时控制heading:对话框文本上方的标题。字符串最大长度限制在256个字符。resource:URL或文件路径。字符串的最大长度是有限的(512个字符)。

LOVE135149的博客 264

C++——STL之空间配置器

STL之空间配置器详细讲解!

学代码的咸鱼的博客 1025

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

weixin_43567873的博客 1983

一篇文章搞懂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的博客 4816

YOLOv11改进策略【注意力机制篇】| SE、CBAM、ECA、CA、Swin Transformer等注意力机制全面解析与应用

本文详细介绍了五种主流的注意力机制及其在YOLOv11中的应用。通过合理的模块选择和位置部署,注意力机制能够显著提升目标检测性能。

QQ_778132974的博客 873

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

方案二是在PS端的MPU配置中,将DMA缓冲区所在的内存区域标记为“不缓存”(Device或Strongly Ordered类型),但这样CPU访问这些内存区的速度会大幅降低,需要根据实时性和数据正确性的需求做权衡。更妙的是,描述符链表可以做成一个环状队列,放在DDR里让DMA循环取走,从而实现持续不断的“流式”传输。用FPGA实现FFT硬件加速的系统中也是如此:PS向PL提交待处理的FFT数据,PL硬件加速计算后,DMA把结果写回DDR,全程CPU几乎只做配置调度,大量数据吞吐留给了硬件通道。

QQ_778132974的博客 173

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

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

fight_p的博客 2833

Centos 7 Linux 安装单机 Hadoop(HDFS):下载、安装、配置、测试

本文详细介绍了在 CentOS 7 系统上安装与配置单机 Hadoop(HDFS)的完整流程,涵盖 JDK 环境准备、Hadoop 安装包下载与部署、核心配置文件(core-site.xml、hdfs-site.xml 等)修改、SSH 免密登录设置、HDFS 格式化及服务启动,并通过命令行与 Web 界面验证 HDFS 和 YARN 功能,适合 Hadoop 初学者快速搭建本地测试环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3234

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

什么是空间配置器。

Elena's Blog 2101

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

[C++][STL之空间配置器]了解

[C++][STL之空间配置器]了解

SnowK博客 3575

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

揭秘——STL空间配置器

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

Sunnylunch-blog 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STL空间配置器allocator详解

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

xy913741894的博客 1万+

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

STL空间配置器学习

2301_77509762的博客 1385

【C++】STL空间配置器

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

一点一点变好 1526

STL空间配置器框架分析

空间配置器是为各个容器高效的管理空间的。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。

GG_Bruse的博客 6619

C++:了解SGI-STL空间配置器

空间配置器什么是空间配置器为什么需要空间配置器SGI-STL空间配置器实现原理一级空间配置器二级空间配置器内存池SGI-STL中二级空间配置器设计SGI-STL二级空间配置器之空间申请 什么是空间配置器 空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。 为什么需要空间配置器 前面在模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方

AngelDg的博客 1172

STL空间配置器

STL源码剖析一书的读书笔记

Aen_hen的博客 1035

STL-空间配置器剖析

网上有很多对于STL空间配置器源码的剖析,之所以这么多人去剖析空间配置器,我觉得是真的设计的太好,而且剖析空间配置器的架构的设计对于C++学者来说是一个不错的提高能力的项目,所以加入到这个解剖大军中来。       参照了侯捷的《STL源码剖析》,原本直接看源码不懂得东西,突然间豁然开朗。再次写下自己对于STL空间配置器的一点点理解。    要了解空间配置器,有一张图是必看的:

如风 6498

C++STL - 容器空间配置器allocator的原理

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录实现一个简单的vector容器容器面临的问题空间配置器介绍实现带空间配置器的vector容器SGI STL一级,二级空间配置器的实现 实现一个简单的vector容器 C++ STL所有容器的实现都需要依赖一个空间配置器allocator,虽然我们平时使用容器...

大秦坑王的专栏 4478

C++的STL之空间配置器

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

ZerO_on的博客 742
上一篇: Libevent解析(二)从简单使用代码剖析建立对Libevent的认识主线
下一篇: 红黑树的删除操作分析(简单粗暴有道理)
山农
博客等级 码龄10年 44粉丝 50原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值