STL源码剖析之一:空间适配器(allocator)

2023-11-17

空间适配器是 所有组件的核心

每个操作系统都有自己的内存分配器

他承担着内存分配 管理 释放

作为模版参数传递到每个容器去


allocate函数分配一片连续的未被构造的空间备用,

deallocate  函数释放空间

construct函数调用布局new,同时调用构造函数,对象被new定位在指定位置

destory 函数调用析构函数,

适配器分一级和二级


第一级适配器剖析:

第一级配置器以malloc() free() remalloc() 等C函数执行实际的内存配置 释放 重配置操作 并实现出类似

C++ new-handler的机制 这里并没有直接使用C++ new-handler机制 (没有使用::operator new来配置内存)

SGI第一级配置器的allocate()和remalloc()都是在调用malloc()和remalloc() 不成功之后 改调用oom_malloc() 和

oom_realloc() 后两者都有内循环,不断调用 ‘内存不足处理例程’,期望在某次调用之后获得足够的内存而圆满

完成任务。若内存不足,会抛异常,异常处理应该提前设定。

但是如果内存不足处理例程没有被设定当内存不足时直接抛出‘__THROW_BAD_ALLOC’ 丢出bad_alloc异常信息。


第二级适配器剖析:

SGI第二级配置器的做法是:如果区块够大,超过128bytes就移交第一级配置器处理。当区块小于128bytes

则以内存池管理:每次配置一大块内存,并维护对应的自由链表;下次若再有内存需求,直接从free list中取。

如果使用者释放了小额区域 就由配置器会收到free-list。为了方便管理,SGI第二级适配器会主动将任何小额区块内存需求上调至8的倍数。

为了维护自由链表 每一个节点都需要额外的指向下一个节点的指针,这对于频繁使用的类库来说,必须锱铢必较。

于是此处有了一个好的解决方案:union联合类型

union obj{

union obj* free_list_link;

char client_data[1];

};

当用户没有申请内存时 free_list_link有效指向下一个节点

当用户申请了内存时 client_data有效 指向内存首地址

同一时间只有一个value有效正是union的特点。

这种技巧在强类型语言JAVA中不会出现,但是在非强行语言C/C++中十分普遍

LUA源码中看到过储存变量也是使用union Lua的变量能相互转化也是基于词机制

参考:

http://blog.csdn.net/effective_coder/article/details/8991980

http://www.voidcn.com/blog/hujian_/article/p-5807328.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL源码剖析之一:空间适配器(allocator) 的相关文章

  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • Jenkins持续集成项目实践 —— 基于Python Selenium自动化测试(二)

    上一篇讲了如何搭建jenkins 这篇主要讲 怎么将自动化代码与jenkins衔接起来 jenkins上运行的两种方式 第一种 在jenkins上面运行本地代码 操作如下 新建项目 项目名称根据自己项目情况填写并选择自由模式 进行配置根据如
  • R语言入门教程知识 第二章 赋值代码与命名规则

    快捷键 新建脚本 Ctrl shift N 清理控制台快捷键 Ctrl L 赋值快捷键ALT 赋值法 1 符号方式赋值 对象名 lt 对象值 2 函数方式赋值 assign 对象 对象值 三大基础函数 numeric 数值型向量 logic
  • 上网原理大透析(MAC,IP,掩码,DNS)

    一 概述 1 1 五层模型 互联网的实现 分成好几层 每一层都有自己的功能 就像建筑物一样 每一层都靠下一层支持 用户接触到的 只是最上面的一层 根本没有感觉到下面的层 要理解互联网 必须从最下层开始 自下而上理解每一层的功能 如何分层有不
  • 内联函数的使用及注意点

    内联函数并不总是内联 Inline function是在C 中引入的一种机制 它可以拓展函数代码 避免调用函数的额外开销 在Linux环境下 gcc编译选项必须加上优化选项才能使inline有效 inline与static的关系 在这儿有一
  • Kafka之基础笔记

    1 kafka offset 存储 1 1 去zookeeper依赖 比较广为人知的Kafka offset存储方式为zookeeper 在0 8版本时 默认依然是zk 但是此时其实已经出现另外一种offset存储方式了 Kafka以 co
  • 如何在ios中集成微信登录功能

    在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做 这样做的好处就是轻量级 程序负重小 在Build Settings 中这样设置 然后设置 友盟的设置同上 但是要注意 加入你需要的所有框架到应用程序中
  • VUE3父子组件传值defineProps() 和 defineEmits()

    defineProps 和 defineEmits 都是只能在
  • 二十三种设计模式第十九篇--命令模式

    命令模式是一种行为设计模式 它将请求封装成一个独立的对象 从而允许您以参数化的方式将客户端代码与具体实现解耦 在命令模式中 命令对象充当调用者和接收者之间的中介 这使您能够根据需要将请求排队 记录请求日志 撤销操作等 命令模式的核心组成部分
  • yaml数组解析_【社区精选】一文看懂 YAML

    本文原作者为陈皮皮 2020年6月11日发布于 微信小游戏开放社区 原文 一文看懂 YAML 前言 YAML 并不是一种新奇的语言 YAML 首次发表于 2001 年 距离现在已经过去差不多 20 个年头 YAML 虽然不如 JSON XM
  • 16/32/64平台上不同内置数据类型所占的字节数大小

    https blog csdn net qq 32535249 article details 88077019 utm medium distribute pc relevant none task blog baidujs title
  • 银行对公账户编码规则

    银行对公账户编码规则 1 工商银行 2 农业银行 3 中国银行 4 建设银行 5 邮储银行 更多 1 工商银行 中国工商银行对公账户共19位 其中1 4位为地区代码 详见代码表 5 8位为网点代码 9 10位为应用号 11 17位为序号 1
  • 计算机网络复习7---差错检验CRC循环冗余检验

    这部分在书中P74页 具体步骤已经写的非常清楚了 这里不做详细介绍 这里着重说一点 是我在刚才复习时才发现一直弄错的地方 希望大家不要出错 在模2除法时 被除数应该是 待传数据 n个0 被除数不是 代传数据 这个很重要 n个0怎么确定呢 书
  • easyexcel 学习

    EasyExcel EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel 语雀 写excel 引言 首先简单讲解一下EasyExcel的写语法 方便理解后续的代码 最
  • 什么是深度学习,如何进行深度学习?

    深度学习的必要性 改革开放40年 基础教育研究与实践的最大成就之一 就是树立了 学生是教育主体 的观念 但是 在课堂教学中 学生并未真正成为主体 大多数课堂教学也没有发生根本变化 为什么 因为大多数教学改革尚未抓住教学的根本 对课堂教学的研
  • java开发sublime插件_开发者最常用的8款Sublime text 3插件

    5 SublimeCodeIntel Sublime Code Intel 作为一个代码提示和补全插件 支持Javascript Mason XBL XUL RHTML SCSS python HTML Ruby Python3 XML S
  • 【常见的编解码场景】

    常见的编解码场景 一 编码与解码 1 1 字符编解码 字符集和编码 编解码过程分析 编解码举例 1 2 http url编码 1 3 http body编码 1 4 压缩编码 1 5 对象编码 netty框架中的编码解码 dubbo框架的编
  • 微信小程序中主包和分包过大,详解分包问题

    哈喽 大家好呀 小韵携原创博文给大家请安啦 前言 开发微信小程序时 若项目比较大 必定要分包 当项目过于大时 则需要细致 谨慎地对项目进行分包优化和精简 这是一个不可避免地问题 网上的大多数分包优化都是针对于小项目的普通官方分包优化 并未将
  • 利用Java EE相关技术实现一个简单的购物车系统

    利用JSP编程技术实现一个简单的购物车程序 具体要求如下 1 用JSP编程实现一个登录页面 登录信息中有用户名和密码 分别用两个按钮来提交和重置登录信息 另外 登录页面请实现记住密码功能 2 编写一个JSP程序来获取用户提交的登录信息并查询
  • Redis Cluster集群主从切换踩坑记

    因为项目的原因采用了Redis Cluster 3主3从 每台主机1主1从 集群信息如下 10 135 255 72 20011 gt cluster nodes 7b662b36489a6240aa21d1cf7b04b84019254b
  • STL源码剖析之一:空间适配器(allocator)

    空间适配器是 所有组件的核心 每个操作系统都有自己的内存分配器 他承担着内存分配 管理 释放 作为模版参数传递到每个容器去 allocate函数分配一片连续的未被构造的空间备用 deallocate 函数释放空间 construct函数调用