stl之空间配置器Allocator

STL 空间配置器 allocator `STL` 空间配置器 `allocator``STL` 标准下的 `allocator`神奇的 `SGI STL``SGI` 里效率低下的 `std::allocator``SGI` 里正规的 `std::alloc`构造 `construct()` & 析构 `destroy()``alloc` 设计哲学`alloc` 的第一级配置器:`__malloc_alloc_template``alloc` 的第二级配置器:`__default_alloc_template` 无私奉献的 alloca 阅读详情

         alloc作为stl容器的空间分配器,主要负责空间的分配allocate和释放deallocate。下面先了解下对象的构造过程:

         对于:

                            classFoo{ … };

                            Foo*ptr = new Foo;

                            deletepf;

         其中new包含两个阶段的工作:1) 调用::operatornew分配内存  2) 调用Foo类构造函数Foo::Foo()构造对象;delete也包含两个阶段:1)调用Foo::~Foo()  2) 调用::operator delete释放内存

         为了精密分工,STLallocator 把这两个阶段的操作分隔开来,由alloc::allocate和alloc::deallocate负责内存的配置和释放操作;由alloc::construct和alloc::destory负责对象的构造和析构操作。

         标准的Allocator接口应包含如下主要内容:

         allocator::allocator

         allocator::construct

         allocator::destroy

         allocator::allocate

         allocator::deallocate

         allocator::address  //返回某个对象的地址

         stl提供了四种空间配置器,如下图:

      

         alloc作为默认的空间配置器,其内部维护了一个内存块数组(数组大小为128/8,从第一个元素到最后一个元素分别对应8bytes和128bytes的内存块链表)和一个内存池(当内存块空间不足时向内存池申请补充),对于申请的内存空间<=128bytes的情况,由内存数组和内存池(当内存数组空间不足时需用到内存池)进行分配;对于大块的内存(>128bytes),其直接调用malloc_alloc::allocate申请.

         此外stl定义了五个全局函数,作用于未初始化空间,分别为:

         construct

         destroy

         uninitialized_copy

         uninitialized_fill

         uninitialized_fill_n

         allocator和以上五个函数的具体介绍及用法可以参考sgi 上的stl说明文档Allocators.html。

         为了提高效率,allocator在析构对象时,对型别进行了区分处理:对基本类型(如int, char, struct等)无需进行析构操作。当进行对象的批量构造时(即调用uninitialized_copy等函数),也会进行标量型别(PlainOld Data) 判断,由此决定是否可用运用memmove操作、是否可直接赋值(不需要调用construct)来提升效率。

实际运用方式:

         template<class T, class Alloc = alloc>

         class vector{

                   typedef simple_alloc<T, Alloc>data_alloctor;

                   data_alloctor::allocate(n); //分配n个元素空间

                   //构造元素

         };

对于vector的clear操作,本质上只是调用了析构函数析构对象,而没有调用alloc的deallocate释放内存,如需释放vector的空间借助swap。

附:

stl_doc下载链接:

http://www.sgi.com/tech/stl/download.html

Docker部署 SRS rtmp/flv流媒体服务器 SRS(Simple Realtime Server)是一款开源的流媒体服务器,具有高性能、高可靠性、高灵活性的特点,能够支持直播、点播、转码等多种流媒体应用场景。SRS 不仅提供了流媒体服务器,还提供了适用于多种平台的客户端 SDK 和在线转码等辅助服务,是一款十分强大的流媒体解决方案。 阅读详情

相关推荐

RGB接口电容触摸屏驱动(一)模块介绍

RGB接口电容触摸屏驱动(一)模块介绍

杰克拉力船长个人博客 7874

一篇文章搞懂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

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1144

STL之空间配置器

为什么需要空间配置器? 通过new申请的空间,虽然代码可以正常运行,但是有以下不足之处: 空间申请与释放需要用户自己管理,容易造成内存泄漏 频繁向系统申请小块内存块,容易造成内存碎片 频繁向系统申请小块内存,影响程序运行效率 直接使用malloc与new进行申请,每块空间前有额外空间浪费 申请空间失败怎么应对 代码结构比较混乱,代码复用率不高 未考虑线程安全问题 SGI-STL空间配置器实现原...

小白的Coding之旅 465

使用LaTex写IEEE trans 论文的参考文献(bib)

(1)在.TeX文件的最下方添加这几行内容,主要为生成tran形式的参考文献,第二行为参考文献名称,我命名为reference.bib,所以写的是reference,要根据自己的命名改写。(5)如果要在文中引用的话,就在.tex文件中添加\cite{},中括号里面内容为方框圈出来部分,但引用之后,在参考文献后面会出现[1]这样的标识,不知道为什么。(4)完成(3)以后,点击工具-命令-LaTeX,编译,然后按照此步骤LaTeX-bibtex-LaTeX-LaTeX,就可以完成参考文献的导入。

qq_45884215的博客 6258

OPC UA 协议详解

OPC UA(统一架构)是新一代工业自动化标准通信协议,替代传统OPC Classic,具有跨平台、高安全性、标准化等优势。基于TCP协议,支持全平台部署,采用面向对象架构组织数据,提供实时读写、事件订阅、历史数据访问等功能。作为工业4.0核心协议,适用于智能制造、数字孪生等场景,能实现多品牌设备统一接入。相比Modbus和MQTT,OPC UA协议更规范安全但复杂度较高,是大型工业集群互联的主流选择。

eastyuxiao的专栏 725

STL空间配置器allocator详解

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

dxmcu的专栏 299

第四章:无感FOC的平滑启动艺术:告别“咔哒”声与抖动

无感FOC启动技术面临"先有位置还是先有旋转"的核心矛盾,导致常见故障包括位置失准、负载突变等。基础方案采用开环I/F控制,但存在重载启动困难等局限性。进阶方案结合IPD位置检测技术,通过脉冲电压注入法精准定位转子初始位置。关键技术在于开环到闭环的平滑切换,采用混合观测器设计和相位对齐技术。量产优化包括自适应参数整定和故障恢复机制,确保启动可靠性和一致性。该系统工程方案可有效解决启动抖动、异响等问题,提升用户体验。

汽车软件开发 732

C++STL 空间配置器allocator

先来介绍一下STL的六大组件1. 空间配置器:内存池实现小块内存分配,对应到设计模式--单例模式(工具类,提供服务,一个程序只需要一个空间配置器即可),享元模式(小块内存统一由内存池进行管理)2.迭代器:迭代器模式,模板方法3.容器:STL的核心之一,其他组件围绕容器进行工作:迭代器提供访问方式,空间配置器提供容器内存分配,算法对容器中数据进行处理,仿函数伪算法提供具体的策略,类型萃取  实现对自...

MOON5555的博客 528

TensorRT - 使用自定义层扩展 TensorRT

TensorRT 支持通过自定义插件扩展功能。开发者可以基于 IPluginV3 接口实现插件类,并通过 IPluginCreatorV3One 创建器类注册到 TensorRT 插件注册表。插件实现需要包含核心、构建和运行时三种能力,并通过静态或动态方式注册。最后可使用 addPluginV3() 将插件实例添加到 TensorRT 网络中。这种方法允许在标准层不满足需求时,使用自定义层扩展模型功能。

1148

N32G430学习笔记11- systick使用函数-延时函数

N32学习笔记11- systick使用函数-延时回调函数-延时函数

Car12 1416

STL源码剖析--空间配置器(allocator)

1.简介 一般容器都需要一定空间存放数据,allocator就是用来配置空间的,SGI的allocator配置的对象时内存。 一个allocator通常包含两个部分,一是内存配置和内存释放(allocate的deallocate),二是对象构造和析构(construct和destory)。 2.一个简单的空间配置器 #ifndef _JJALLOC_ #define _JJALLOC_ #incl...

littleflypig的博客 322

爆肝整理:微信公众号文章HTML编写完整规范,运营必备手册

微信公众号文章排版总是出错?📱 这份完整的HTML编写规范文档帮你彻底解决!文档包含所有支持的标签、CSS属性、实用代码模板和注意事项 📋,让你快速掌握微信文章的HTML编写技巧,告别第三方编辑器依赖 ✅

XiaoqiangClub的博客 2303

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

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

weixin_42255569的博客 1718

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

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

C++ STL标准库:空间配置器allocator

文章目录1. 前言2. 为什么需要空间配置器?3. allocator类模板 1. 前言 STL中每个容器的第二个模板参数都是 allocator类型而且默认参数都是 allocator explicit vector (const allocator_type& alloc = allocator_type()); explicit list (const allocator_type& alloc = allocator_type()); template <> class

超级大洋葱的博客 932

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STL学习笔记——空间配置器(allocator)

STL学习笔记——空间配置器(allocator)

weixin_48956191的博客 402

STL-空间配置器(allocator)

SGI空间配置器allocator的标准接口allocator::value_type allocator::pointer allocator::const_pointer allocator::reference allocator::const_reference allocator::size_type allocator::diffrence_type allocator::rebind

Linkin_ygw的博客 635

【STL源码剖析】【2、空间配置器——allocator】

【STL源码剖析】【2、空间配置器——allocator】

zwh1298454060的博客 1435

STL学习笔记--2、空间配置器 allocator

STL allocator alloc

Cherryuuuu 3285

C++ STL源码解析:空间配置器(allocator)

C++ STL空间配置器std::allocator的 原码解析,主要解析allocate底层的一级空间配置器、二级空间配置器

slzz_的博客 924

【STL】SGI空间配置器 Allocator

本篇将主要总结归纳《STL源码剖析》的空间配置器的相关STL实现。在此之前,我们也将总结归纳一些基本的C++知识和技法。 一、C++基础知识--3种new的方式 在C++中,包含3种new形式,分别是  new / delete operator new / operator delete placement new    在C++中,我们所习惯的C++内存配置操作和释放

小do在努力 721

【STL2】空间配置器allocator

目录 标准模板库 1.空间配置器allocator总述 2.空间配置器标准接口 3.二级空间配置器 标准模板库 1.空间配置器allocator总述 标准模板库中利用空间配置器来在幕后管理内存空间。之所以叫空间配置器,是因为可能在某种情况下,可以在内存以外的介质比如硬盘上进行分配。不过一般来讲是内存,有下面两种空间配置器。 一种是标准的空间配置器,std:allocator //包含在xmemory头文件,对::operator new和::operator delete的简单封装 一种是

飞舞哲 426

STL 学习之空间配置器(allocator)

空间配置器(allocator)  学习(一)allocator必要接口以及SGI的第一级配置器    allocator不一定操作内存,也可以直接向硬盘取空间。    简单说就是管理容器的资料的空间的工具。    根据规范,allocator的必要接口为:    allocator::value_type allocator::pointer allocator::const_pointer a...

zxzamt的博客 581

STL之空间配置器allocator

以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体的说是指容器,container)的背后,默默的工作,默默付出。但若以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以放置资料。不先掌握空间配置器的原理,难免在阅读其它STL组件的实现时处处遇到挡路石。为什么不说allocator是内存配置器而说它是空间配置器呢?因为空间不一定是内存,空间也可以是磁盘或其它辅助存储介质。

chnming1987的博客 1282

STL空间配置器(Allocator)

大内存直接依赖mallocfree,简单高效;小内存通过“内存池+空闲链表”减少碎片,提升复用率。这种设计完美体现了STL“效率优先”的哲学——在抽象内存管理的同时,通过针对性优化(如对齐、内存池)确保“零抽象开销”,让容器的内存操作既灵活又高效。

u010632343的博客 803

STL学习笔记(1)空间配置器 allocator

1 简述     STL其他组件都是存放在空间配置器配置的空间中,此处空间可以是内存,也可以是磁盘或其他辅助存储介质。     allocator负责内存的分配和释放,以及负责对象的构造和析构,两个操作时分开的。     每个容器都已经制定了默认的空间配置器Alloc,如下图所示。 若要使用自己的空间配置器则必须vector&amp;amp;amp;amp;amp;amp;amp;lt;int,my_alloc&amp;amp;amp;amp;amp;amp;amp;gt; mv; 2 标

RaKiRaKiRa的博客 416
上一篇: xml文件解析(二)——运用libxml2库解析xml文件
下一篇: stl之迭代器(iterator)
LinuxG_G
博客等级 码龄15年 58粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值