STL内存管理器(Allocator)简单理解

C++内存池优化:从std::allocator原理到高性能自定义分配器实现 内存分配是C++程序性能优化的核心环节,其本质是管理程序运行时对系统内存资源的请求与释放。标准库默认的std::allocator基于通用的operator new/delete实现,虽然保证了通用性,但在频繁进行小块内存分配时,会因系统调用开销、全局锁竞争和内存碎片问题导致显著的性能瓶颈。内存池技术通过预分配大块内存并在内部精细化管理的原理,将多次系统级调用转化为高效的内部指针操作,从而在性能敏感场景中提供确定性的低延迟和高吞吐量。这一技术对于游戏引擎、高频交易系统等需要处理海量小对象或要求实时响应的应用 阅读详情

转自:http://blog.youkuaiyun.com/yfkiss/article/details/6633337

1. 概述

STL Allocator是STL的内存管理器,也是最低调的部分之一,你可能使用了3年stl,但却不知其为何物。

STL标准如下介绍Allocator

the STL includes some low-level mechanisms for allocating and deallocating memory.Allocators are very specialized, and you can safely ignore them for almost all purposes.Allocators encapsulate allocation and deallocation of memory. They provide a low-level interface that permits efficient allocation of many small objects;different allocator types represent different schemes for memory management.

<STL 源码剖析>将其描述为空间配置器,理由是allocator可以将其它存储介质(例如硬盘)做为stl 容器的存储空间。由于内存是allocator管理的主要部分,因此,本文以STL内存管理为出发点介绍allocator。

Allocator就在我们身边,通常使用STL的方式:
#include <vector>
std::vector<int> Array(100);

本质上,调用的是:

#include <vector>
std::vector<int, std::allocator> Array(100);

std::allocator就是一个简单的Allocator

2. 为什么需要了解Allocator

项目中遇到的两个case
1)memory高位

线上使用vector保存待处理的数据,在停服务追数据的过程中,由于vector::clear并不释放内存,造成内存始终处于高位。
参考:http://blog.youkuaiyun.com/yfkiss/article/details/6537234

2)多线程使用vector、map

使用map保存状态,在多线程环境下,出现性能问题

在实际使用STL的过程中,会遇到很多问题,需要了解STL Allocator

3. 使用

针对不同的应用场合,STL中实现了不同的Allocator,如下(gcc-3.4:http://www.cs.huji.ac.il/~etsman/Docs/gcc-3.4-base/libstdc++/html/20_util/allocator.html):

__gnu_cxx::new_allocator<T> Simply wraps ::operator new and ::operator delete.
__gnu_cxx::malloc_allocator<T> Simply wraps malloc and free. There is also a hook for an out-of-memory handler
__gnu_cxx::debug_allocator<T> A wrapper around an arbitrary allocator A. It passes on slightly increased size requests to A, and uses the extra memory to store size information.
__gnu_cxx::__pool_alloc<bool, int> A high-performance, single pool allocator. The reusable memory is shared among identical instantiations of this type.
__gnu_cxx::__mt_alloc<T> A high-performance fixed-size allocatorthat was initially developed specifically to suit the needs of multi threaded applications
__gnu_cxx::bitmap_allocato A high-performance allocator that uses a bit-map to keep track of the used and unused memory locations

例如,在多线程环境下,可以使用:

  1. #include <vector> 
  2. #include <mt_allocator.h> 
  3. std::vector<int, __gnu_cxx::__mt_alloc<int>> Array(100); 
#include <vector>
#include <mt_allocator.h>
std::vector<int, __gnu_cxx::__mt_alloc<int>> Array(100);

4.一个简单的Allocator实现
我们可以实现自己的allocator

  1. #include <memory> 
  2.  
  3. template<class T> 
  4. class my_allocator : public std::allocator<T> 
  5. { 
  6. public: 
  7. typedef std::allocator<T> base_type; 
  8.  
  9. // 必须要重新定义 
  10. template<class Other> 
  11. struct rebind 
  12. { 
  13. typedef my_allocator<Other> other; 
  14. }; 
  15. // 内存的分配与释放可以实现为自定义的算法 
  16. pointer allocate(size_type count) 
  17. {  
  18. return (base_type::allocate(count)); 
  19. } 
  20.  
  21. void deallocate(pointer ptr, size_type count) 
  22. {  
  23. base_type::deallocate(ptr, count); 
  24. } 
  25.  
  26.  
  27. // 构造函数 
  28. my_allocator() 
  29. {} 
  30.  
  31. my_allocator(my_allocator<T> const&) 
  32. {} 
  33.  
  34. my_allocator<T>& operator=(my_allocator<T> const&) 
  35. {  
  36. return (*this); 
  37. } 
  38.  
  39. template<class Other> 
  40. my_allocator(my_allocator<Other> const&) 
  41. {} 
  42.  
  43. template<class Other> 
  44. my_allocator<T>& operator=(my_allocator<Other> const&) 
  45. {  
  46. return (*this); } 
  47. };  
#include <memory>

template<class T>
class my_allocator : public std::allocator<T>
{
public:
typedef std::allocator<T> base_type;

// 必须要重新定义
template<class Other>
struct rebind
{
typedef my_allocator<Other> other;
};
// 内存的分配与释放可以实现为自定义的算法
pointer allocate(size_type count)
{ 
return (base_type::allocate(count));
}

void deallocate(pointer ptr, size_type count)
{ 
base_type::deallocate(ptr, count);
 }


// 构造函数
my_allocator()
{}

my_allocator(my_allocator<T> const&)
{}

my_allocator<T>& operator=(my_allocator<T> const&)
{ 
return (*this);
 }

template<class Other>
my_allocator(my_allocator<Other> const&)
{}

template<class Other>
my_allocator<T>& operator=(my_allocator<Other> const&)
{ 
return (*this); }
}; 

 

读了libstdc++ std::allocator源码,发现它在GCC 5之后被彻底重写了——C++内存分配的3层架构 和malloc之间一个关键的行为差异在于它们对分配失败的处理方式——malloc在失败时返回nullptr(由调用者检查),而在失败时默认抛出异常。但在抛异常之前,会先尝试调用一个用户可设置的回调函数——new-handler。└─ 调用 malloc(size)├─ 成功 → 返回指针└─ 失败 → 检查 new_handler 是否已设置├─ 已设置 → 调用 new_handler(),然后重试 malloc│ (循环直到成功或 new_handler 被改为 nullptr) 阅读详情

相关推荐

针对中文CLIP模型训练失效的解决方案记录

解决了中文CLIP模型无法正确训练的问题

weixin_45906434的博客 1620

不得不说的故事:STL内存管理

1. 概述 STL Allocator是STL的内存管理器,也是最低调的部分之一,你可能使用了3年stl,但却不知其为何物。 STL标准如下介绍Allocator the STL includes some low-level mechanisms for allocating and deallocating memory. Allocators are very specialized...

ruilinruirui 476

手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表)

本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。

weixin_30879169的博客 526

GNU C++ Allocator分类总结与归纳

文章目录1. new_allocator & malloc_allocator2. 智能 Allocator2.1 智能 Allocator 概念、思路和实现 本文以GNU C++为例子进行总结归纳,主要是对GNU C++当中的 Allocator 的类别和个中思想进行分别讲解和整理。 同时经过之前的系列文章,可以知道 Allocator 主要用于满足容器中的 Element 进行空间的分配任务需求。也即是,当客户将元素加入容器中,容器必须分配更多内存以保存这些元素,于是容器向其所含的 Alloc

To the beyond and infinity! 1344

Python自动化生成HyperMesh Tcl命令流:从几何建模到有限元分析

本文详细介绍了如何利用Python自动化生成HyperMesh的Tcl命令流,实现从几何建模到有限元分析的全流程二次开发。通过封装常用操作函数,工程师可以高效完成参数化建模、自动网格划分及求解器文件输出,显著提升CAE前处理效率与标准化水平。

weixin_29041767的博客 423

ISO7816协议深度解析-简单易懂协议详解(一)-- 复位,字符帧,及ATR

1. 摘要 IC卡必须支持T=0或T=1的协议,但不是同时支持这两种协议,而终端则必须同时支持T=0和T=1的协议。 • T=0通讯协议是异步半双工字符传输协议; • T=1通讯协议是异步半双工块传输协议; 在ISO7816-3标准中,具体规定了这两种协议:T0和T1。 IC卡所用的协议在TD1中指定,如果在复位应答信息中没有TD1,则表示用T=0的协议进行通讯。在复位应答后,IC卡和终端之间即用IC卡指定的协议进行通讯。 2. 硬件接口 1)VCC:电源输入(A类:5V, B类:3V) 2)GND:地 3

代码打工人的博客 4万+

STL容器的内存管理

class Unit { public: Unit(); Unit(int id); ~Unit(); private: int id = -1; }; Unit::Unit() { } Unit::Unit(int _id) :id(_id){ printf("Unit construction. id=%d\n", id); } Unit::~Unit() { prin...

how0723的博客 452

matlab物元可拓模型程序,熵权可拓物元模型

1 概述物元分析方法是中国学者蔡文于20世纪80年代提出的用于解决矛盾问题的技术方法,是研究物元及其变化规律,解决现实世界中不相容问题的有效方法,可应用于生态环境,水资源承载力,农用地分级和土地生态水平等综合评价研究中.本文主要介绍了熵权可拓物元模型的相关概念与该模型的建立过程.2 概念2.1 物元物元分析法的主要思想是把事物用"事物,特征,量值"(分别用N,C,V表示)3个要素以有序三元组的形式...

weixin_33823399的博客 4101

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

【PX4学习笔记】1. ROS及PX4环境搭建

环境 Ubuntu18.04 安装教程参考 https://www.guyuehome.com/8983 安装过程中问题的解决 问题1 rosdep init 错误的终极解决方法 注意etc/下的ros和rostep文件夹要自己建 问题2 Ubuntu安装ROS报错 sudo: rosdep:找不到命令 问题3(更好地解决了问题1、2)【推荐】 解决GitHub的raw.githubusercontent.com无法连接问题 问题4:GeographicLib的安装 教程中安装GeographicLib d

【人工智障 | 计算鸡视觉 | 机器孩】 8230

Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)

大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。

cpp加油站的专栏 517

游戏设计模式——内存池管理

前言:对C++游戏程序员来说,内存管理是一件相当头疼的问题。因为C++是将内存赤裸裸的交给程序员,而不像Java/C#有gc机制。 好处是这样对于高性能要求的游戏程序,原生的内存分配可以避免gc机制的臃肿操作,从而大大提高性能。 坏处是C++程序员得时时警惕内存问题: 内存泄露问题 do{ T* object = new T(); }while(0); 上面的例子中。忘记回收内存,函数退栈导致...

weixin_34289744的博客 316

go语言实现服务器server端与客户client端即时通信(附完整源码)

go语言实现服务器server端与客户client端即时通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 626

SGI STL的空间配置器alloc

这两天通过阅读SGI  STL源码,与《STL源码剖析》上侯捷对于源码的非常好的讲解与注释,me理解了C++关于内存管理的具体实现方法,觉得大有所益。。。整理一下,将实现空间配置器所用的策略大致记录下来。 1. STL容器简介 STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存

qq973177663的专栏 838

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ STL记录

STL六大部件: 1、容器,2、分配器,3、算法,4、迭代器,5、适配器,6、仿函数。 1、容器 顺序式容器:array,vector,list,forward_list,deque 关联式容器:set,multiset,map,multimap,unordered_set,unordered_map array: 使用 array 容器类型时,需要在源文件中包含头文件 array。array相当...

____Se7en 183

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STL之内存分配器

STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写。 例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,...

weixin_30718391的博客 230

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

allocator_traits深度解密:为什么你的C++17容器迁移总报错?

本文深度剖析了C++17标准中allocator_traits的设计哲学与行为变化,解释了从C++11/14迁移时容器报错的根本原因。文章通过源码分析揭示了allocator接口的演进,即从全能型内存管理器转变为专注资源分配,而对象构造/析构逻辑由allocator_traits统一提供。核心解决方案是统一使用allocator_traits接口,并提供了编写兼容C++11至C++20自定义分配器的实战指南与迁移检查清单。

jwt8token的博客 407

条目十一《理解自定义分配子的合理用法》

条目十一《理解自定义分配子的合理用法》 根据大牛们的测试: STL默认的内存管理器(allocator)太慢,或者浪费内存,或者在使用的时候会产生内存碎片。 又或者需求不一样时: 1.allocator是多线程安全的,而你运行环境是单线程,所以想减少线程同步带来的te不必要开销。 2.当想把容器的对象放到一个特殊堆的相邻位置,做到引用局部优化。 3.建立一个共享内存相对应的特殊堆,在这块内存...

weixin_34014277的博客 130

C++内存管理(2)—内存操作相关函数

转载请注明出处:https://www.jianshu.com/p/ca51012db547 C++内存管理(1)——分配和释放的四个层面 上一篇中从整体上来看系统中四个层面上内存的分配和释放,这样我们就对内存分配有了一个整体的认识。这一节则详细的来写写这四个层面中的操作符或函数的使用方法,以及他们背后的调用关系。首先我们从我们使用最多的new和delete来说起。 1. new 和 dele...

翼遥君的博客 841

STL:如何释放vector占用的内存

(一道百度面试题) C++ STL中vector的相关问题,调用clear时,内部是如何具体实现的?若想将其内存释放,该如何操作?   假设有一个vector x(100); 这样首先会申请(100*sizeof(int))的内存大小。调用clear函数仅仅是将数据清除,而申请的内存还是存在的,并没有释放掉。可以调用下面的语句进行释放: { vector t; t.s

xingdebocqyz的专栏 1587

STL内存分配器

题记:内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。最近阅读了一些内存管理实现方面的

733

C++ STL自定义内存分配器:从原理到内存池实现

内存管理是C++高性能编程的核心技术之一,其原理在于程序运行时如何高效地分配和回收内存资源。通过自定义内存分配器,开发者可以深入控制内存分配策略,从而优化性能、减少碎片,并适应特定场景需求。这项技术的核心价值在于能够显著提升内存密集型应用的效率,尤其在游戏开发、高频交易和嵌入式系统等对性能敏感的场景中作用突出。本文以**内存池分配器**和**性能优化**为例,详细解析了如何构建一个符合STL标准的自定义分配器,涵盖类型系统、rebind机制、对齐处理等关键实现细节,并提供了实用的调试技巧与最佳实践。

weixin_34306593的博客 381

C++内存管理

1.前言 学习侯捷老师的《内存管理》这门课。 Memory Management 101 第一讲 primitives 第二讲 malloc/free 第三讲 std::allocator 第四讲 other allocators 第五讲 loki::allocator 万丈高楼平地起 源码之前,了无秘密。 你应该具备的基础 曾经动态分配并使用memory 曾经使用过C++标准库的容器(containers) 我们的目标 从平地到万丈高楼 从最基础的C++语言构建到高知名度的内存管理器,彻底了解高高低低

小小博客 309

stl源码分析之vector

Vector_base专门负责vector的内存管理,内部类_M_impl通过继承_Tp_alloc_type得到内存分配释放的功能,_M_allocate和_M_deallocate分别分配和释放vector所用内存,vector只需要负责元素构造和析构。_M_finish和_M_end_of_storage之间的空间没有数据,有时候这是一种浪费,c++11提供了一个很有用的函数shrink_to_fit(),将这段未使用空间释放,主要调用了下面代码,pointer _M_end_of_storage;

木牛的博客 379

c++内存管理

1 前言 c++应用程序永远逃脱不了同一个主题,那就是内存管理,内存管理的好坏直接影响程序的性能与稳定。最常见的c++语言内存分配基础构件就是new/delete,其内部最终是调用的C函数malloc/free来实现的。也经常会用到stl库中的各种容器,如list,map,set等,其实,他们也都依托于标准库中实现的std::allocator分配器进行内存管理。因此,从我们经常用到的内存相关的表达式,函数,容器出发,去了解它们的实现机理及应用策略,这对于我们更加熟练合理的运用内存分配工具具有很大的意义。

tianzhiyi1989sq的博客 271

C++内存管理变革 .

http://blog.youkuaiyun.com/xushiweizh/article/details/1388982 C++内存管理变革 许式伟 2005-7-16 关键字: 内存管理 垃圾回收器 内存配置器 引用计数 keyword: memory manage, memory recycler, allocator, reference count 引言 C/C+...

diaoqu4574的博客 176
上一篇: 深入理解HTML协议(含Cookie和Session详细比较)
下一篇: 二进制补码范围简单总结
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值