C++ STL 中的空间配置器 alloctor 学习笔记

2024-01-15 10:50

本文主要是介绍C++ STL 中的空间配置器 alloctor 学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

uy_allocator


练习代码: https://github.com/bobbymly/uy_allocator

引言

  • 使用空间配置器,而不是直接将所有的内存需求都直接向系统申请一块内存的一个重要原因就是要尽量避免内存碎片。
  • 将所有的需求都通过向系统申请系统,不仅会带来内存碎片的问题,配置时的额外负担也是不可忽略的。
  • 第二级配置器可以通过一次申请一大块内存,通过内存池和 free_list 来管理和负责小内存区块分配,这样在系统中的内存就不会被频繁的分割并产生过多内存碎片以及配置时的额外负担。

uy_allocator_1.h 第一级空间配置器

直接使用 malloc 从系统中申请内存空间

uy_allocator_2.h 第二级空间配置器

避免太多的小额区块造成内存的碎片

  • 空间管理策略是
  • 当申请的空间够大 (大于 128 bytes)时,直接交由第一级空间配置器处理
  • 当申请的空间较小 (小于 128 bytes)时,以 free_list 和内存池管理

  • 第二级空间配置器 使用一个 free_list 管理不同大小的内存块(所有内存块的管理与申请均提升为 8 bytes 的整数倍)
  • 当所申请的内存块大小在 free_list 中有对应大小的剩余内存块可以使用时,直接从 free_list 中分配
  • 否则,从内存池中一次分配 20 个申请大小的内存块,一个用于使用,19 个添加到 free_list 中备用

  • 当内存池中内存不足 20 个 申请的内存块大小时
  • 若足够一个则给与一个放回使用
  • 剩余的小区块内存直接添加到 free_list 中(充分利用)
  • 然后调用第一级空间适配器 向内存池中补充内存

process diagram

这篇关于C++ STL 中的空间配置器 alloctor 学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/608639

相关文章

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元