SGISTL源码探究-第一级配置器

分子动力学仿真软件:LAMMPS_(16).应用案例分析 通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。 阅读详情

前言

在本小节中,我们主要介绍第一级配置器的做法。

第一级配置器(__malloc_alloc_template)

引入

第一级配置器用于处理大于128bytes的情况,即申请大的内存。直接使用malloc和free申请释放即可。(现在有可能不是以128bytes为标准了,不过源码本来就是主着学习的目的,不管现在是多少,至少你能从中学到思想就够了)

深入源码
  //这里是一个模板偏特化技术,即int类型,可以提供不同的实例,比如__malloc_alloc_template<0>和__malloc_alloc_template<1>就是两个不同的版本。这样做的好处是拥有不同的static。
  template <int inst>
  class __malloc_alloc_template
  {
    private:
    //oom代表out of memory
    //以下函数用于处理内存不足的情况
    static void *oom_malloc(size_t);
    static void *oom_realloc(void *, size_t);
    static void (*__malloc_alloc_oom_handler)();
    public:
    //用malloc申请n个大小的空间
    static void *allocate(size_t n)
    {
      void *result = malloc(n);
      //如果失败了,则调用处理函数
      if(0 == result) result = oom_malloc(n);
      return result;
    }
    //用free释放空间
    static void deallocate(void *p, size_t )
    {
      free(p);
    }
    //用realloc重新申请空间
    static void *reallocate(void *p, size_t, size_t new_sz)
    {
      void *result = realloc(p, new_sz);
      //如果失败了,则调用处理函数
      if(0 == result) result = oom_realloc(p, new_sz);
      return result;
    }

    //这里实际上是模仿了操作符new里面的`set_new_handler()`函数,可以让用户自己定义内存不足时的处理函数,并返回旧的处理方法。(这里的参数还有样子可以看起来有点绕,其实就是两个函数指针,返回的类型是函数指针,传入的参数也是函数指针)
    static void (* set_malloc_handler)(void (*f)())()
    {
      void (*old)() = __malloc_alloc_oom_handler;
      __malloc_alloc_oom_handler = f;
      return (old);
    }
  };

接下来就是oom部分

  template <int inst>
  void (*__malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = 0;

  //当malloc申请内存不足时
  template <int inst>
  void *__malloc_alloc_template<inst>::oom_malloc(size_t n)
  {
    //引入局部函数指针
    void (*my_malloc_handler)();
    void *result;

    //注意,这是一个死循环,要么申请内存成功,要么抛出异常。否则一直执行出错处理程序。(这和new里面的机制是一样的)
    for(;;)
    {
      my_malloc_handler = __malloc_alloc_oom_handler;
      //如果__malloc_alloc_oom_handler为null的话,那么直接抛出异常
      if(0 == my_malloc_handler)
      {
        __THROW_BAD_ALLOC;
      }
      //否则调用处理程序
      (*my_malloc_handler)();
      //尝试分配,如果失败,重新循环;如果成功了,退出
      result = malloc(n);
      if(result) return (result);
    }
  }

  //oom_realloc和oom_malloc的处理逻辑是相同的
  template <int inst>
  void *__malloc_alloc_template<inst>::oom_realloc(void *p, size_t n)
  {
    void (*my_malloc_handler)();
    void *result;

    for(;;)
    {
      my_malloc_handler = __malloc_alloc_oom_handler;
      if(0 == my_malloc_handler)
      {
        __THROW_BAD_ALLOC;
      }
      (*my_malloc_handler)();
      result = realloc(p, n);
      if(result) return (result);
    }
  }

  typedef __malloc_alloc_template<0> malloc_alloc;
分析
  1. 在第一级配置器中,当malloc和realloc分配内存不成功时,会调用各自的oom_xxx,里面会调用用户自己设置的__malloc_alloc_oom_handler,如果成功申请,则返回,否则当用户没有设置__malloc_alloc_oom_handler时,就直接抛出异常了,如果设置了,则调用处理程序,然后又如此反复。该机制和new的确类似,如果你已经了解new的做法,那么这个就很容易理解了。
  2. 至于那个template <int inst>,如果将其直接实现为类,假设有多个实例,会有点问题。我们都知道static变量在类中只会被保留一份,如果将__malloc_alloc_template实现成简单的类,那么每次实例化对象的时候,__malloc_alloc_oom_handler都是上一次改变的值,而我们要求的是,应该由用户自己来定义处理程序,所以应该每次使用一个新的一级配置器时,处理程序的初始值都该为null。(你可能会想,那就不用static关键字,别忘了static还有隐藏变量和函数的作用,用于封装)。不过,事实上我们根本不用担心这么多,因为最后一行代码直接将__malloc_alloc_template<0>typedef成了malloc_alloc,只用了一个一级配置器。

小结

在本小节中,主要介绍了第一级配置器中申请以及释放内存的做法,申请内存时类似new操作符的机制。使用第一级配置器还是第二级配置器主要是根据要求分配的空间大小来定。在下一小节我们主要分析第二级配置器。

把 ABAP ALV 表头做成两层分组:用 TOP-OF-PAGE 手工绘制双行列标题 摘要:本文介绍了在SAP ALV List中实现双层表头的方法。通过关闭系统默认列标题(no_colhead='X'),在TOP_OF_PAGE事件中手动绘制表头,使用sy-uline和sy-vline绘制线条实现分组效果。关键点包括:1)关闭系统表头;2)在事件处理中分两行输出分组标题和字段名;3)利用系统自动拼接线条的特性绘制表格边框。文中还指出了常见问题如线条自动粘连、颜色不生效等,并提供了完整示例代码和详细解释。这种方法适用于需要对字段进行业务分组的报表场景。 阅读详情

相关推荐

Hive数据仓库分层架构实战:4层黄金模型×6大业务场景×万亿级数据优化方案

根据《2023数据中台成熟度报告》,‌78%的ETL任务性能瓶颈‌源于分层设计不合理。本文基于某头部电商平台PB级数据仓库建设经验,结合金融风控、用户画像、实时大屏等核心场景,深度解析‌ODS→DWD→DWS→ADS‌四层架构设计原则,揭秘‌万亿级数据治理方案‌与‌维度建模20大避坑策略‌。

优快云博客专家,领域包括但不限于:AI、大数据、Python、架构师,有合作、课程、问题、疑惑请私信博主 1483

SGI STL:空间配置器——第一级配置器:__malloc_alloc_template

STL空间配置器——第一级配置器 out of memory处理方法

Sauron7i的博客 523

FPGA数字信号处理中定点数的舍入与饱和硬件实现详解

在数字信号处理(DSP)的硬件实现中,定点数运算是核心基础。由于硬件资源(如FPGA的DSP Slice)的位宽有限,连续的乘加运算会导致数据位宽膨胀,严重影响时序和资源利用率。为解决此问题,必须引入舍入(Rounding)和饱和(Saturation)机制。舍入通过对低位进行四舍五入,在可控的精度损失下缩减位宽;饱和则作为动态范围的守护者,防止数据溢出导致信号环绕失真,确保系统行为确定。这两种技术是算法在有限精度硬件上正确、高效运行的关键,广泛应用于滤波器、FFT等DSP模块以及通信、音频处理等场景。本文

weixin_30954817的博客 247

STL空间配置器(一级配置器及二级配置器)

前言 在我们日常使用STL中的容器时,我们是几乎感受不到空间配置器的存在,因为他一直在默默工作,我们在之前的这一篇博客中也大概介绍过:C++(21)——vector及实现自定义vector以及allocator和iterator空间配置器,整个STL的操作对象都存放在容器之后。而容器需要配置空间以放置资料,这也就是空间配置器的作用。 注:STL提供了自定义空间配置器的接口,但是不建议自己定义,因为系统提供的空间配置器是足够安全且高效的,所以在我们使用时,一般会使用默认的配置器。 template<cl

qq_44824574的博客 3124

如何在 SAP Server Side JavaScript 里消费 destination

在SAP云平台里打开SAP HANA Web-Based Development Workbench进行服务器端JavaScript的开发。 创建一个新的package: 创建一个新的application: 创建一个新的文件google-distance-api.xshttpdest用于维护destination相关信息: host = "maps.googlea...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 611

图片风格自动分析模型

对于分类任务,我们可以使用交叉熵损失作为损失函数。同时,我们可以选择随机梯度下降(SGD)或Adam等优化器进行模型优化。# 使用SGD优化器# 或使用Adam优化器在这部分,总结整个项目的过程,包括数据准备、模型构建、训练、优化和评估等。同时,讨论可能的改进方向和未来工作,例如尝试更多的模型结构、优化技巧等。

a871923942的博客 1698

【STL深入学习】SGI STL空间配置器详解(一)-第一级空间配置器

一、SGI STL配置器简介 SGI STL的配置器与众不同,它与标准规范不同。如果要在程序中明确使用SGI配置器,那么应该这样写: vector iv;他的名字是alloc,而且不接受任何参数。标准配置器的名字是allocator,而且可以接受参数。 SGI STL的每一个容器都已经指定了缺省配置器:alloc。我们很少需要自己去指定空间配置器。比如vector容器的声明:

计算机专业同学的充电站。 6961

Python爬虫实战:抓取全球各国海关进出口数据的全流程教程

本文系统介绍了用Python采集全球各国海关进出口数据的完整流程,从数据源调研、技术选型,到代码实战、数据处理和存储,最后还拓展了进阶反爬和动态内容处理方法。希望这篇博文能帮助你掌握专业的数据采集技能,为后续数据分析和商业应用奠定坚实基础。

2201_76125261的博客 2362

【STL】SGI空间配置器(一):一级空间配置器

今天看了STL中的空间配置器,写一篇博客小小的总结一下。 首先STL空间配置器的产生在实际的软件开发中,当我们使用C++中的malloc、new、free和delete时,我们不可避免的会因为程序的需求,使用很多的小内存块,这个过程是不一定能够控制好的,例如下面的场景 而且一直调用malloc和new产生小块内存不光会产生内存碎片,而且系统调用会产生性能问题。内碎片与外碎片内碎片:因

leap的博客 1669

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7183

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 153

【深度探索STL】空间配置器(一) 构造和析构

以STL运用的角度而言,空间配置器总是隐藏在一切组件的背后,但就STL 的实现角度而言,我们需要了解空间配置器,因为整个STL 的操作对象(所有数值,“value”语意)都存放在容器之内,而容器一定需要配置空间以置放数据。没必要重复造轮子,但我们知道这轮子背后如何运作,有利于我们更好地驾驭轮子。另一方面通过阅读源码可以学习大神的编程思想。 一般而言,我们所习惯的C++ 内存配置操作和释放操作是这

wenqian 'blog 3805

ESP32 VSCode开发环境配置

ESP32 VSCode开发环境配置

qq_53529450的博客 507

STL空间配置器——第一级配置器__malloc_alloc_template剖析

1.原理介绍: SGI STL第一级配置器采用的: 1.allocate()直接调用malloc 或者reallocate()直接调用realloc deallocate()直接使用free 2.模拟C++的set_new_handler机制以处理内存不足的情况,: 当调用allocate()未分配到内存时,会调用oom_mallc(),它会不断尝试释

哒哒的博客 1199

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SGISTL源码探究-默认使用的配置器

前言在上节中我们主要分析了chunk_alloc函数,在本小节中,我们先对第一级配置器和第二级配置器的使用做个整理,随后再介绍空间配置器提供的初始化未初始化空间的接口。默认使用的配置器当我们使用vector这些容器时,其实是默认指定了使用的空间配置器的,比如vector在源码中的模板头是这样的template <class T, class Alloc = alloc>,默认指定了配置器为alloc

Move_now的博客 499

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STL之空间配置器源码解析

配置器(allocator) 配置器:负责空间配置与管理,从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的模板类。 空间配置器意义:整个 STL 的操作对象(包含的所有数值)都存放在容器之内,空间配置器就是用来帮助这些容器管理(动态开辟,回收)内存空间,使其可以动态存放内容。 SGI STL 空间配置器的结构 SGI STL 的配置器,其名称是 alloc 而不是 allocator,而且不接受任何参数。allocator 只是基层内存配置/释放行为(::operator::new 和

angry_youth的博客 318

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

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

SGISTL源码阅读一 空间配置器上(第一级配置器__malloc_alloc_template)

SGISTL源码阅读一 空间配置器上(第一级配置器) 引入 我们所熟知的C++内存配置操作一般为 class A {} A* pa = new A(); //1.分配内存 2.构造对象 delete pa; //1.对象析构 2.释放内存 其中new完成了两个操作 1.调用operator new配置内存 2.调用A::A()构造对象 这样做没有考虑到任何效率上的强化,如果有些空间根本不...

Lyn&Xx 460

SGISTL源码探究-vector容器(上)

前言vector容器应该算是最常用的容器之一了,它是序列式容器的一种,即元素可被排序。vector被称为动态数组,可以随着元素的加入,内部的大小自行扩充。可能你对vector的机制有所耳闻,比如每次扩充时,扩充当前容量的2倍等。接下来,我们就进入到它的源码来看看vector是如何实现的。我们将它分为四部分进行分析,vector的迭代器,vector的内存分配及构造,vector的内存控制以及一些常用

Move_now的博客 810

SGI STL的二级空间配置器的源码剖析并内存池的实现源码剖析

2019年8月16日23:41:07 剖析源码的好处:学习优秀的编程规范 和 设计理念;以及剖析源码的能力。 内存池的实现 内容如下: SGI STL二级空间配置器源码 Nginx内存池源码剖析 这两种内存池的实现和应用场景都是不一样的。 为什么要内存池呢? 答:C语言的库函数malloc和free C++的new和delete(其底层的内存管理上依旧是malloc和free)。但是在应用场...

孤傲小二~阿沐的博客 800

SGI STL二级空间配置器源码剖析(1)

之前大概写过SGI STL相关的东西,讲了讲空间配置器的原理,这一系列就剖析一下源码。在C++STL里空间配置器做的事情就是分离了对象内存的开辟,释放,对象构造,析构我们看SGI STL的实现还是找到vector看他push_back实现会发现他的构造析构都是定义的全局的函数模板SGI STL两个allocator的实现还是一级的是malloc和free,和C++STL基本无差,不过二级的用内存池的方式实现就复杂了进到空间配置器源码看看。

oorik的博客 597

SGISTL源码探究-第二级配置器

前言在本小节中我们将主要分析第二级配置器申请/释放内存的做法,它的主要实现机制是靠free_lists以及内存池来实现。内存池放在单独的一小节进行讲解。第二级配置器(__default_alloc_template)引入第二级配置器要比第一级复杂的多。它的做法是,如果要求申请的空间大于128bytes,则让第一级配置器去做,如果小于128bytes,则由内存池提供,而第二级配置器只负责维护16个fr

Move_now的博客 494

STL源码学习(1)-空间配置器

本文主要剖析了SGI STL的一二级空间配置器,内存基本操作函数

ylh的博客 534

SGI STL二级空间配置器内存池的源码移植项目

2019年8月21日23:39:54 首先SGI STL二级空间配置器内存池的源码解剖可以 详见我的博客: SGI STL二级空间配置器内存池的源码解剖 源码移植实现空间配置器是用模板实现的,因此代码只能放在头文件里面了。(不可以把类和方法声明写在头文件里面,然后在源文件里面去实现模板方法)而且这里也是需要考虑一下:多线程环境下的线程安全问题。毕竟空间配置器是给容器使用的,而容器产生的对象是 很有...

孤傲小二~阿沐的博客 509

SGISTL源码探究-空间配置器

前言该系列的博客主要是看《STL源码剖析》以及一些相关的博客得到的心得及一些自己的理解整理而成,如有错误请指出,谢谢。遵照《STL源码剖析》一书的顺序进行分析,先是STL的空间配置器方面。allocator引入事实上,我们在学习C++的时候,接触到空间配置器应该就是allocator,它用于申请一块未初始化的空间,这是因为new会执行两个动作,首先申请空间,其次调用其构造函数。但是如果有些空间根本就

Move_now的博客 559

深度剖析SGI STL二级空间配置器内存池源码

文章目录一、SGI STL二级空间配置器重要成员解读1. 二级空间配置器内存池的结构2. 两个重要的函数(1) _S_round_up(2)_S_freelist_index3. 内存池allocate分配过程 一、SGI STL二级空间配置器重要成员解读 SGI STL包含了一级空间配置器和二级空间配置器 其中一级空间配置器allocator采用malloc和free来管理内存,和C++标准库中提供的allocator是一样的 但其二级空间配置器allocator采用了基于freelist自由链表原理的

长期更新自学笔记 1803

STL源码分析--空间配置器 第一级配置器

一、SGI STL配置器简介 SGI STL的配置器与众不同,它与标准规范不同。如果要在程序中明确使用SGI配置器,那么应该这样写: [cpp] view plaincopyprint? vectorint,std::alloc> iv;   他的名字是alloc,而且不接受任何参数。标准配置器的名字是allocator,而且可以接受参数。 SGI S

鱼思故渊的专栏 1031
上一篇: SGISTL源码探究-空间配置器
下一篇: SGISTL源码探究-第二级配置器
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值