c++(空间配置器)[32]

这篇具有很好参考价值的文章主要介绍了c++(空间配置器)[32]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

空间配置器

c++(空间配置器)[32],C++,c++,开发语言
c++(空间配置器)[32],C++,c++,开发语言

一级空间配置器 || 二级空间配置器

c++(空间配置器)[32],C++,c++,开发语言
默认先走二级然后判断

二级空间配置器

c++(空间配置器)[32],C++,c++,开发语言
一个指针指向start_free然后start_free向后移动,相当于哈希桶的头删和头插
c++(空间配置器)[32],C++,c++,开发语言
8byte:切大补小
C++的二级空间配置器按照8字节(或者更大的倍数)切分内存的原因有以下几点:

  1. 内存对齐:许多计算机体系结构要求数据在内存中的地址是对齐的,即数据的起始地址必须是某个特定值的倍数。按照8字节切分内存可以确保分配的内存块的起始地址满足对齐要求,从而提高内存访问的效率。

  2. 减少内存碎片:内存碎片是指分配的内存块之间存在的未使用的小块内存。通过按照8字节切分内存,可以减少内存碎片的产生。如果按照较小的单位(如1字节)切分内存,会导致更多的内存碎片,降低内存的利用率。

  3. 提高内存分配的效率:按照8字节切分内存可以提高内存分配的效率。二级空间配置器使用了一些数据结构(如自由链表)来管理内存池,按照固定大小的块进行切分可以简化数据结构的设计和操作,从而提高内存分配的速度。

需要注意的是,按照8字节切分内存并不是绝对的规定,具体的实现可能会根据不同的编译器、操作系统和硬件平台进行调整。但按照8字节切分内存是比较常见的做法,可以在大多数情况下获得较好的性能和内存利用率。

好的,我来具体解释一下被还回来的小空间是如何被申请的大空间利用的过程。以下是一个简化的示意图:

+-----------------------+
|         大空间         |
+-----------------------+
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
+-----------------------+
  1. 初始状态:大空间被划分为多个小空间,每个小空间的状态为已分配或未分配。
+-----------------------+
|         大空间         |
+-----------------------+
|   |   |   |   |   |   |
|   | A |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
+-----------------------+
  1. 释放小空间:当程序不再需要某个小空间时,将其释放回内存池。
+-----------------------+
|         大空间         |
+-----------------------+
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
+-----------------------+
  1. 标记小空间为可用:二级空间配置器会将被释放的小空间标记为可用。
+-----------------------+
|         大空间         |
+-----------------------+
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
+-----------------------+
  可用   可用   可用
  1. 分配大空间:当程序需要申请大空间时,二级空间配置器会查找可用的连续小空间。
+-----------------------+
|         大空间         |
+-----------------------+
|   |   |   |   |   |   |
|   | A |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
+-----------------------+
  1. 标记小空间为已分配:二级空间配置器会将被分配的小空间标记为已分配,并从内存池中移除。
+-----------------------+
|         大空间         |
+-----------------------+
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|   |   |   |   |   |   |
+-----------------------+

通过这个过程,被还回来的小空间可以被申请的大空间利用,从而实现内存的高效利用。

需要注意的是,实际的内存管理过程可能更加复杂,涉及到内存碎片的合并、内存池的扩展等操作。上述示意图仅用于说明基本的内存分配和释放过程。

不是所有进程都公用一个空间配置器。在操作系统中,每个进程都有自己独立的虚拟地址空间,这意味着每个进程都有自己的内存管理单元。

每个进程的内存管理单元负责管理该进程的内存分配和释放。这包括将进程所需的内存从操作系统中分配出来,并在进程不再需要时将其释放回操作系统。

因此,每个进程都有自己的空间配置器,用于管理其内存分配和释放。这样可以确保每个进程的内存操作互不干扰,提高了系统的安全性和稳定性。

需要注意的是,不同进程之间可以通过进程间通信的机制共享内存,但共享的内存通常是通过特殊的方式进行管理,而不是直接使用一个公用的空间配置器。

碎片(一部分一部分还)
空间配置器的碎片指的是内存中的小块未被使用的空间,这些空间可能散落在已分配的内存块之间,无法被有效利用。为了解决内存碎片的问题,空间配置器通常会采取合并碎片的策略。

具体来说,当一个内存块被释放回空间配置器时,空间配置器会尝试将其与相邻的空闲内存块进行合并,以形成更大的连续空闲内存块。这个过程称为内存碎片的合并。

合并碎片的策略可以有多种实现方式,以下是一种常见的策略:

  1. 首次适应(First Fit):空间配置器会从内存池中的第一个空闲内存块开始遍历,找到第一个足够大的空闲内存块来满足分配请求。如果找到了合适的内存块,就将其分割成两部分,一部分用于分配,另一部分保留为新的空闲内存块。

  2. 循环首次适应(Next Fit):类似于首次适应,但是从上一次分配的位置开始遍历内存池,直到找到合适的内存块。这样可以减少遍历的次数。

  3. 最佳适应(Best Fit):空间配置器会遍历整个内存池,找到能够满足分配请求并且大小最接近的空闲内存块。这样可以最大程度地减少内存碎片。

  4. 最坏适应(Worst Fit):空间配置器会遍历整个内存池,找到能够满足分配请求并且大小最大的空闲内存块。这样可以保留更多的小空闲块,但是可能会导致更多的内存碎片。

无论采用哪种策略,合并碎片的目的都是尽可能地利用内存,减少内存碎片的影响。通过合并碎片,空间配置器可以提供更大的连续内存块,从而满足大内存分配的需求。

c++(空间配置器)[32],C++,c++,开发语言
解决外碎片问题的方法之一是使用内存池(Memory Pool)或内存池分配器(Memory Pool Allocator)。

内存池是一种预先分配一大块连续内存的数据结构,然后根据需要从该内存池中分配小块内存。内存池可以避免频繁向系统申请小块内存的开销,并且可以减少外碎片的产生。

以下是解决外碎片问题的一种基本思路:

  1. 在程序初始化阶段,分配一大块连续的内存作为内存池。

  2. 将内存池划分为固定大小的小块内存,可以使用链表或位图等数据结构来管理这些小块内存的分配情况。

  3. 当需要申请小块内存时,从内存池中找到一个空闲的小块内存进行分配。

  4. 当小块内存不再使用时,将其标记为空闲,并将其归还到内存池中。

通过使用内存池,可以避免频繁向系统申请小块内存,从而减少了内存碎片的产生。此外,内存池还可以提供连续的内存块,使得可以更容易地申请大块内存。

需要注意的是,使用内存池也会带来一些额外的开销,比如内存池的初始化和管理。因此,在选择是否使用内存池时,需要根据具体的应用场景和需求进行权衡。

STL六大组件

  1. 容器(Containers):STL提供了多种容器类,如vector、list、deque、set、map等。容器类提供了不同的数据结构,用于存储和管理数据。每种容器类都有自己的特点和适用场景,可以根据需要选择合适的容器类。

  2. 算法(Algorithms):STL提供了一组常用的算法,如排序、查找、合并、删除等。这些算法可以应用于各种容器类,提供了高效的实现和使用方式。使用STL算法可以简化编程过程,提高代码的可读性和可维护性。

  3. 迭代器(Iterators):STL提供了迭代器作为容器和算法之间的桥梁。迭代器提供了一种统一的访问容器元素的方式,可以通过迭代器遍历容器中的元素,实现对容器的操作。STL还提供了不同种类的迭代器,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,每种迭代器都有不同的功能和限制。

  4. 仿函数(Functors):STL中的仿函数是一种可调用对象,类似于函数指针,可以在算法中使用。仿函数可以作为算法的参数,用于定义算法的行为。STL提供了一些内置的仿函数,如比较仿函数、数值仿函数等,同时也可以自定义仿函数。

  5. 适配器(Adapters):STL提供了适配器用于修改容器或者算法的接口。适配器可以将一种容器或算法的接口转换为另一种接口,使得它们可以互相兼容。STL中常见的适配器有迭代器适配器、函数适配器等。

  6. 分配器(Allocators):STL提供了分配器用于管理内存的分配和释放。分配器可以为容器提供自定义的内存管理策略,如内存池分配器、堆分配器等。通过分配器,可以控制容器的内存使用方式,提高内存的分配效率和性能。

c++(空间配置器)[32],C++,c++,开发语言
c++(空间配置器)[32],C++,c++,开发语言

复习

vector:基于动态数组
list:双向链表
set:平衡二叉搜索树(元素唯一)
map:红黑树
unordered_map:基于哈希表(Hash Table)
std::unordered_set:基于哈希表实现,它存储一组无序的唯一元素。std::unordered_set提供了快速的插入、删除和查找操作,平均情况下的时间复杂度为O(1)。

map和unorder_map,set和unorder_set的本质区别

std::mapstd::unordered_mapstd::setstd::unordered_set的本质区别在于它们使用的底层数据结构和提供的操作效率。

  1. std::mapstd::unordered_map的本质区别:
  • std::map基于红黑树实现,它保持了元素的有序性。红黑树是一种自平衡的二叉搜索树,提供了对键的快速查找、插入和删除操作,时间复杂度为O(log n)。std::map中的元素按照键的顺序进行排序,因此可以用作有序的查找表。
  • std::unordered_map基于哈希表实现,它使用键的哈希值来确定元素的存储位置。哈希表提供了快速的插入、删除和查找操作,平均情况下的时间复杂度为O(1)。std::unordered_map中的元素没有固定的顺序,因此不能用作有序的查找表,但它在大多数情况下提供了更快的操作。
  1. std::setstd::unordered_set的本质区别:
  • std::set基于红黑树实现,它存储一组有序的唯一元素。std::set提供了高效的插入、删除和查找操作,时间复杂度为O(log n)。
  • std::unordered_set基于哈希表实现,它存储一组无序的唯一元素。std::unordered_set提供了快速的插入、删除和查找操作,平均情况下的时间复杂度为O(1)。

因此,std::mapstd::set适用于需要有序元素或按照键进行排序的场景,而std::unordered_mapstd::unordered_set适用于对元素顺序没有要求,但需要更快的操作速度的场景。

c++(空间配置器)[32],C++,c++,开发语言
c++(空间配置器)[32],C++,c++,开发语言
multi版本:允许键值冗余

c++(空间配置器)[32],C++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-637109.html

到了这里,关于c++(空间配置器)[32]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++学习记录——삼십삽 STL空间配置器

    我们先看malloc,malloc是创建在堆上的,虽然malloc可以申请内存,但也有限制,windows下用VirtualAlloc可以直接向堆申请内存,Linux中则是brk,不过这两个效率一般。 malloc向堆申请函数,它本身是个内存池,只是这个内存池面向整个程序。空间配置器运行在malloc之上,是一个小的内

    2024年02月09日
    浏览(24)
  • C/C++|物联网开发入门+项目实战|空间读写|非字符空间|返回值内部实现|嵌入式C语言高级|C语言函数的使用(2)-学习笔记(12)

    参考: 麦子学院-嵌入式C语言高级-C语言函数的使用 空间的读写 void fun(char *p); const char *p 只读空间,只为了看 char *p;该空间可能修改,几乎都要变 strcpy(); 定义:char *strcpy(char *dest,const char *src); sprintf(); 作用 1、修改 int * short * long * 2、空间传递 2.1 子函数看看空间里的情况

    2023年04月22日
    浏览(46)
  • 从C语言到C++_38(C++的IO流+空间适配器)STL六大组件联系

    目录 1. C语言的输入和输出和流 2. C++的IO流 2.1 C++标准IO流 2.2 C++文件IO流 2.3 stringstream(字符流) 3. 空间配置器(了解) 3.1 一级空间适配器 3.2 二级空间配置器 3.3 二级空间适配器的空间申请 3.4 二级空间配置器的空间回收 3.5 对象构造与释放和与容器结合 4. STL六大组件联系

    2024年02月09日
    浏览(28)
  • C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

    参考: 麦子学院-嵌入式C语言高级-内存空间 内存类型资源地址、门牌号的代名词 指针:地址的代名词 指针变量:存放指针这个概念的盒子 *P char *p *p; C语言娟译器对指针这个特殊的概念,有2个疑问? 1、分配一个盒子,盒子要多大? 在32bit系统中,指针就4个字节 2、盘子里存放

    2023年04月22日
    浏览(42)
  • 计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)

    三点睡六点起,阎王夸我好身体 不到三点我不睡,太平间里抢C位 目录: 前言: 本片博客是以学习过C语言之后进入C++学习为前提,讲解C++入门级知识,为C++之后的学习做铺垫 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀

    2024年04月11日
    浏览(113)
  • C/C++|物联网开发入门+项目实战|函数输入与输出|值传递|地址传递|连续空间的传递|嵌入式C语言高级|C语言函数的使用-学习笔记(11)

    参考: 麦子学院-嵌入式C语言高级-C语言函数的使用 一堆代码的集合,用一个标签去描述它 复用化,降低冗余度 标签 ------ 函数名 函数和数组都属于内存空间,函数具备3要素: int *p; int a[100]; 1、函数名(地址) 2、输入参数 3、返回值 在定义函数时,必须将3要素告知编译器

    2023年04月20日
    浏览(41)
  • [开发语言][C++]:递增递减运算符

    递增运算符和递减运算符为对象的+1和-1提供了简洁的书写形式。 自增自减运算符的应用: 这两个运算符除了应用在算术运算,还可应用于迭代器,因为很多迭代器并不支持算术运算。 递增和递减运算符有两种书写形式:前置版本和后置版本。 前置版本 ++i --i :首先将运算

    2024年01月25日
    浏览(38)
  • 2023最新版本~KEIL5使用C++开发STM32

    ▬▬▬▬▬▶用C++开发Keil◀▬▬▬▬▬ 因为是第一次写这个配置教程 我会尽量详细些 打开一个Keil工程 移除本地core 添加在线core 第一次编译代码 不会有报错 修改main.c文件类型为C++ 点击魔术棒 把ARM编译器修改为V6 第二次编译会报错语法不兼容 我把汇编部分的这些代码做了

    2024年02月12日
    浏览(35)
  • 开发环境搭建-stm32CubeIDE配置

    使用方法如下: 在CubeIDE的安装路径STM32CubeIDEplugins下找到org.eclipse.cdt.ui_7.3.201.202205131409.jar,并将此文件改名备份,然后,将下载的同名插件文件复制到该路径下,重新启动STM32CubeIDE即可。 百度地址 链接: https://pan.baidu.com/s/17qxUiMLNhVgsV0rx0f2U5g 提取码: a5yf Window-preferences-General

    2024年02月09日
    浏览(32)
  • STM32的vscode开发环境配置

    此文章写给我即将到来的Robocon学弟 目录 前言 一、vscode的下载安装 二、编译环境的下载 1.make工具 2.gcc-arm-none-eabi工具链 3.OpenOCD烧录 三、STM32CubeMX生成项目 总结 关于STM32的开发环境,新手最熟悉的应该就是Keil了,但是Keil这个软件的界面实在是太难看了,而且添加文件结构也

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包