STL空间配置器

 空间配置器(allocator)(重点)

背景需求:在底层默默的实现空间的分配

问题:空间的申请与对象的创建两者分开,因为不断创建的时候可能会频繁的申请空间扩容。

类似操作:reserve函数,new表达式,都是先申请空间然后再创建对象。

空间配置器的操作: 

//空间的申请,申请的是原始的,未初始化的空间
pointer allocate( size_type n, const void * hint = 0 );
T* allocate( std::size_t n, const void * hint); 
T* allocate( std::size_t n );
//空间的释放
void deallocate( T* p, std::size_t n );
//对象的构建,在指定的未初始化的空间上构建对象,使用的是定位new表达式
void construct( pointer p, const_reference val );
//对象的销毁
void destroy( pointer p );

【注意】为什么还需要将对象进行单独的销毁,直接随着空间的销毁而销毁就好了。因为有可能有堆上的空间,需要通过销毁对象可以删除堆上的空间。

当空间小于128的时候,就认为是小的空间,可以一次性将空间申请下来然后再划分为小的片段。1.也是避免出现碎片化的问题。可能出现空间太过于碎片化,不能申请下来。
2.申请空间需要进入内核态,避免在内核态和用户态之间频繁切换。

主要的函数是在于s_refill 和s_chunk函数

其实申请了1280空间,其中的640字节开头会交给_free_start指针表示结尾由end指示,会返回回来640个字节,并且将每个分为32字节。其中的一个32字节会被返回,剩下的19个32字节会通过一个链表链接起来。挂接在下标为3的自由链表下面。

chunk其中的640字节会交给refill函数处理,剩下的640交给自由链表

下次再申请的时候64字节块再申请的640字节直接交给refill,而不是再申请空间,因为原本的s_start_free 和 s_end_free在32字节块划分完成以后差值是640,在64划分完以后,两者又相等了。

这个时候自由链表中下标为3的下面就是19个32字节的字节快,64下面是链接9个字节快。

当没有足够的空间的时候,会向上申请,有可能有80,88,96等有这样的数据块。有这样的块的话就拆下来一个借给其他节点。将96拆成72和24,用内存池的两个指针进行指向继续24的开头和结尾。并没有从找两块64拼接起来,因为可能这两块并不是连续的,因为可能会回收,回收的时候顺序就不一定了。

改变了nobjs的数值为1直接就返回nobjs

构建对象使用到定位new表达式:

new(__p) _Tp(_val);

销毁对象: __p->~Tp();

对比理解就是vector<int> vec(3) = {1,2,3};

int arr[3] = {1,2,3};  vec取地址不能取到第一个元素的地址,但是arr取地址可以得到第一个元素的地址,因为vec的元素是在堆上的,arr的元素是在栈上的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/764706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动扫描范围在减少剂量多相CT肝脏成像中的应用:基于CNN和高斯模型| 文献速递-深度学习自动化疾病检查

Title 题目 Automatic scan range for dose-reduced multiphase CT imaging of theliver utilizing CNNs and Gaussian models 自动扫描范围在减少剂量多相CT肝脏成像中的应用&#xff1a;基于CNN和高斯模型 01 文献速递介绍 肝癌是全球癌症死亡的第四大原因&#xff0c;每…

告别推广迷茫,Xinstall渠道包助您精准统计应用商店数据!

在App推广的浩瀚征途中&#xff0c;每一位广告主和开发者都面临着同样的挑战&#xff1a;如何在众多应用商店中脱颖而出&#xff0c;实现高效推广与精准获客&#xff1f;今天&#xff0c;就让我们一同探索Xinstall应用商店渠道包的独特魅力&#xff0c;看看它是如何成为解决这一…

【产品经理】聊聊PLG策略

PLG 是一种以用户增长为导向的策略&#xff0c;如何理解这种策略&#xff1f;适合采用PLG模式的SaaS又有哪些&#xff1f; 一、企业软件采购方式的变迁 从用户的角度&#xff1a;企业软件采购从CIO主导&#xff0c;逐渐演化为经理或者员工可做出决策。 从供应商的角度&#x…

剪映 v5.5 Pro Vip解锁版:使用指南与注意事项

摘要&#xff1a;本文介绍了剪映Pro VIP解锁版的使用方法&#xff0c;包括安装、测试和使用VIP素材的步骤&#xff0c;以及如何避免误报和保持解锁状态的建议。 正文&#xff1a; 剪映Pro是一款广受欢迎的视频编辑软件&#xff0c;提供了丰富的视频编辑功能和大量高质量的素材…

自动化测试报告pytest-html样式美化

最近我将 pytest-html 样式优化了 一版 先看优化前&#xff1a; 优化后&#xff1a; 优化内容包括&#xff1a; 删除部分多余字段新增echart图表部分字体大小、行间距、颜色做了美化调整运行环境信息移至报告最后部分字段做了汉化处理&#xff08;没全部翻译是因为&#xf…

python学习-函数

函数 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 内置函数可重复使用 为什么要学习、使用函数呢&#xff1f; 为了得到一个针对特定需求、可供重复利用的代码段 提高程序的复用性&#xff0c;减少重复性代码&#xff0c;…

记一次阿里云服务器java应用无法响应且无法远程连接的问题排查

问题表现 java服务无响应&#xff0c;无法远程链接到服务器。 今天中午12点多&#xff0c;应用直接崩溃。后续进入到服务器&#xff0c;发现java进程都不在了&#xff0c; 排查过程 先安装atop工具 安装、配置并使用atop监控工具 等下次再出现时看相关时间点日志&#xff…

Docker在windows上使用vscode远程连接容器

目录 一、提前准备&#xff1a; 二、vscode连接docker容器 三、构建好的docker容器直接连接vscode 四、Windows下的可视化出linux的ui界面 在日常的开发中&#xff0c;不想windows和linux两个系统之间来回切换&#xff0c;笔者最近打算所有的环境均在一个系统上完成。为了交…

26K Star!LLM多智能体AutoGen教程3:我的外包弟弟写代码

读到这里想必已经入门AutoGen了&#xff0c;但怎么让它自动写代码自动调试啊&#xff0c;我也想要一个外包弟弟给我干活&#xff0c;我就喝杯茶摸摸鱼审核一下代码就好了呀。这不巧了&#xff0c;最近PM要求我给他弄一份某SDK支持车厂的列表&#xff0c;这种简单的事情在以前我…

msvcp140_ATOMIC_WAIT.dll丢失的多种解决方法分享,实测有效

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp140_ATOMIC_WAIT.dll丢失”。那么&#xff0c;msvcp140_ATOMIC_WAIT.dll丢失是怎么回事呢&#xff1f;本文将从msvcp140_ATOMIC_WAIT.dll丢失的原因分析、对电脑的影响以及解决方…

武汉星起航:自运营团队驾驭亚马逊市场,领航跨境新纪元,成绩斐然

在跨境电商的浪潮中&#xff0c;武汉星起航电子商务有限公司的自运营团队以其卓越的运营能力、深厚的市场洞察力和灵活的应变策略&#xff0c;在亚马逊这片广阔的电商海域中&#xff0c;书写了一段又一段辉煌的篇章。 武汉星起航的自运营团队&#xff0c;是一支由经验丰富、技…

PyTorch入门笔记

学习参考&#xff1a; PyTorch简单入门视频 深入浅出PyTorch 小土堆笔记 前置知识 AI vs ML vs DL AI&#xff08;Artificial Intelligence&#xff09;&#xff1a;通过让机器模仿人类进而超越人类ML&#xff08;Machine Learning&#xff09;&#xff1a;让机器模仿人类的一…

RabbitMQ 之 延迟队列

目录 ​编辑一、延迟队列概念 二、延迟队列使用场景 三、整合 SpringBoot 1、创建项目 2、添加依赖 3、修改配置文件 4、添加 Swagger 配置类 四、队列 TTL 1、代码架构图 2、配置文件代码类 3、生产者 4、消费者 5、结果展示 五、延时队列优化 1、代码架构图 …

Android 11.0 SettingsProvider 源码分析

文章目录 一、SettingsProvider 的概述二、SettingsProvider 的启动流程三、对 SettingsProvider 进行操作方法四、客制化示例 一、SettingsProvider 的概述 SettingsProvider 是一个为 Android 系统设置提供数据共享的 Provider&#xff0c;它包含全局、安全和系统级别的用户…

AI大模型对话(上下文)缓存能力

互联网应用中&#xff0c;为了提高数据获取的即时性&#xff0c;产生了各种分布式缓存组件&#xff0c;比如Redis、Memcached等等。 大模型时代&#xff0c;除非是免费模型&#xff0c;否则每次对话都会花费金钱来进行对话&#xff0c;对话是不是也可以参照缓存的做法来提高命…

207.贪心算法:最大子数组和(力扣)

代码展示 class Solution { public:int maxSubArray(vector<int>& nums) {int result INT_MIN; // 初始化结果为最小可能的整数int sum 0; // 初始化当前子数组和为0// 遍历数组中的每一个元素for (int i 0; i < nums.size(); i){sum nums[i]; //…

PHP电商系统开发指南最佳实践

电子商务系统开发的最佳实践包括&#xff1a;数据库设计&#xff1a;选择适合关系型数据库&#xff0c;优化数据结构&#xff0c;考虑表分区&#xff1b;安全&#xff1a;加密数据&#xff0c;防止 sql 注入&#xff0c;处理会话管理&#xff1b;用户界面&#xff1a;遵循 ux 原…

【仪器仪表】 矢量网络分析仪 Vector Network Analyzer

主要功能&#xff1a; 测量S参数&#xff1a; S11&#xff08;输入反射系数&#xff09;&#xff1a;测量输入端口的反射。S21&#xff08;正向传输系数&#xff09;&#xff1a;测量从输入端口到输出端口的传输。S12&#xff08;反向传输系数&#xff09;&#xff1a;测量从输…

MobPush 第三方插件:Uni-app

插件集成 访问MobPush插件、MobCommon插件点击购买并添加到项目当中。在uniapp的“manifest.json”中选择“app原生插件配置”&#xff0c;点击勾选上方添加的两个插件完成上述两步后请务必先打自定义基座哦&#xff0c;否则SDK代码无法生效&#xff01; iOS平台相关配置 添…

软考《信息系统运行管理员》-2.2 信息系统运维的组织

2.2 信息系统运维的组织 信息系统运维的任务 数据资源管理 数据收集、数据校验、数据录入、数据处理 软件资源管理 采购、保存、相关文档保管、分发、安装、支持、评价、培训 硬件资源管理 检查、维护、故障处理、更新、修复、扩充 系统安全管理 可用性、完整性、保密性、可控…