2.空间配置器

  1. SGI 特殊的空间配置器 std::alloc

    一般而言,我们习惯的C++内存配置操作和释放操作是这样的

    class Foo{…..}

    Foo* pf = new Foo;

    delete pf;

       

    new包含两阶段操作 (1)调用 ::operator new 配置内存 (2)调用 Foo::Foo() 构造对象内容。

    delete也包含两阶段操作 (1)调用 Foo::~Foo() 将对象析构 (2)调用::operator delete 释放内存。

       

    SGI<memory> 内含以下两个文件

    #include<stl_alloc.h> //负责内存空间的配置与释放

    #include<stl_construct.h> //负责对象内容的构造与析构

       

  • 构造和析构基本工具: construct() 和 destroy()

    destroy有两个版本,第一版本接受一个指针,直接调用该对象的析构函数。

    第二版本接收 frist 和 last 两个迭代器, 将 [frist, last)范围内的所有对象析构掉。

    首先利用 value_type () 获得迭代器所指对象的型别, 再利用 _type_traits<T> 判断该型别支持的析构函数是否是无关痛痒(trivial destructor ),若是,则什么也不做就结束,若不是,以循环寻访整个范围,并在循环中每经历一个对象就调用第一个版本的destroy()。

       

  • 空间的配置与释放 std::alloc

       

    对象构造前的空间配置和对象析构后的空间释放,由<stl_alloc.h>负责

    (1)向system heap 要求空间

    (2)考虑多线程状态

    (3)考虑内存不足时的应变措施

    (4)考虑过多"小型区块"可能造成的内存碎片问题。

       

    考虑到小型区块所可能造成的内存破碎问题,SGI设计了双层级配置器。第一级配置器直接使用malloc() 和free(), 第二级配置器则视情况采用不同的策略:当配置区块超过 128bytes 时,视之为"足够大",便调用第一级配置器;当小于128bytes时,视之为"过小",为了降低额外的负担,采用复杂的 memory pool整理方式。

       

       

       

  • 第一级配置器 __malloc_alloc_template

    SGI 第一级配置器的 allocate() 和 realloc()都是在调用 malloc() 和 realloc() 不成功之后,改调用 oom_malloc() 和 oom_realloc() 两者都有内循环,不断调用"内存不足处理例程",期望在某次调用后获得足够的内存而圆满完成任务,但如果"内存不足处理例程"未被客户端设定,便会抛出异常。

       

  • 第二级配置器 __default_alloc_template

    第二级配置器多了一些机制,避免太多小额区块造成内存的碎片。小额区块带来的不仅仅是内存碎片的问题,配置时的额外负担也是很大的问题。系统要靠这多出来的空间来管理内存。区块愈小,额外负担所占比例就越大,就越浪费。

       

    SGI第二级配置器的做法是,如果区块够大,超过128bytes时,就移交第一级配置器,当小于128bytes时,则以内存池(memory pool)管理,此法又称次层配置:

    每次配置一大块内存,并维护之自由链表,下次若再有相同大小的内存需求,就直接从free-lists中拔出,如果客户端释还小额区块,就由配置器回收到free-lists中。 为了方便管理,SGI第二级配置器会主动将任何小额区块的内存需求量上调至8的倍数,并维护16个 free-lists,各自管理大小为8,16,24,32,40,56,64,72,80,88,96,104,112,120,128bytes

       

  • 空间配置函数allocate()

  • 空间释放函数deallocate()

  • 重新填充 free lists

    当它发现free lists中没有可用的区块时,就调用refill(),准备为free list 重新填充空间。新的空间将取自内存池。

       

  1. 内存基本处理工具

       

  • uninitialized_copy()

    uninitialized_copy()使我们能够将内存的配置与对象的构造行为分离开来。

    如果作为输出目的地[result, result + (last - frist)) 范围内每一个迭代器都指向未初始化区域, 则 uninitiated_copy() 会使用 copy consturctor, 给身为输入来源之[frist, last] 范围内的每一对象产生一份复制品,放进输出范围中。

       

       

       

  • Uninitialized_fill()

       

       

  • Uninitialized_fill_n()

   

Uninitialized_fill_n()能够使我们将内存配置与对象构造行为分离开来,它会为指定范围内的所有元素设定相同初值

   

   

接受三个参数

(1)迭代器指向与初始化空间的起始处

(2)n 表示欲初始化空间的大小

(3)x 表示初值

   

首先萃取出迭代器Frist 的型别再判断是否是POD型别

POD指plain old data, 标量型别

   

   

转载于:https://www.cnblogs.com/h3mmm/p/9821093.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github的简单使用(网页版)

目录Git和GithubGithub基础概念注册Github账号创建仓库及文件新建仓库新建文件文件的编辑和删除编辑或修改文件删除文件文件的上传文件的查找及下载文件的查找文件的下载IssuesFork开源项目贡献流程Git和Github 什么是Git Git是一个免费、开源的版本控制软件 什么是版本控制…

常用到的正则表达式

2019独角兽企业重金招聘Python工程师标准>>> 常用的正则表达式 1、匹配只含有英文字母和阿拉伯数字 ^[a-zA-Z0-9-]$ 2、匹配电子邮件地址 ^[_a-z0-9-](\.[_a-z0-9-])*[a-z0-9-](\.[a-z0-9-])*$ 3、匹配中文字符 [\u4e00-\u9fa5] 4、匹配国内座机电话号码 (\d{3}-|\d…

docker多个容器一起打包_docker如何将容器打包成镜像

可以使用docker commit命令来完成&#xff0c;docker commit可以从容器创建一个新的镜像。语法格式&#xff1a;docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]参数说明&#xff1b;-a :提交的镜像作者&#xff1b;-c :使用Dockerfile指令来创建镜像&#xff1b;-m :提…

CSDN绑定GitHub账号

目录1.点击自己头像进入个人中心2.点击账号设置&#xff0c;选择绑定三方账号3.选择GitHub绑定绑定成功&#xff0c;主页获取勋章1.点击自己头像进入个人中心 2.点击账号设置&#xff0c;选择绑定三方账号 3.选择GitHub绑定 绑定成功&#xff0c;主页获取勋章

My97DatePicker在asp.net项目中的使用

1、去官网下载 My97DatePicker 包 http://www.my97.net/ 2、比如实现如下图所示功能 2.1 先把下载来的包添加到解决方案 2.2 然后在页面引用css文件和js文件 <link href"My97DatePicker/skin/WdatePicker.css" rel"stylesheet" type"text/css"…

机械秒表的使用方法_让console.log()不再是你的唯一选项js日志输出6种方法

几乎所有的javascript开发者最常使用的日志打印调试api都是console.log(),其实还有很多的选项供我们选择&#xff0c;笔者下面就为大家一一介绍.一、console.table()console.table()是我非常建议大家去使用的方法&#xff0c;它可以接受JSON或数组并以表格格式打印&#xff0c;…

Git的安装(附安装包)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

【10.20校内测试】【小模拟】【无向图建树判奇偶环】【树上差分】

Solution 和后面两道题难度差距太大了吧&#xff01;&#xff01; 显然就只是个小模拟&#xff0c;注意判0就行了。 Code #include<bits/stdc.h> using namespace std;char s[100005];int main() {freopen("expression.in", "r", stdin);freopen(&qu…

基础知识整理

1. 数据结构与算法 1.1 书籍 &#xff08;1&#xff09;算法导论 &#xff08;2&#xff09;编程之美 &#xff08;3&#xff09;编程珠玑 &#xff08;4&#xff09;数据结构&#xff08;C语言版&#xff09; &#xff08;5&#xff09;CareerCup.Cracking.the.Technical.Inte…

验票证明怎么打印_OFD电子发票如何查验、打开、打印?如何电子归档?

原标题&#xff1a;OFD电子发票如何查验、打开、打印&#xff1f;如何电子归档&#xff1f;电子发票是现代信息社会的产物&#xff0c;具有与纸质发票相同的凭证属性。它的诞生有利于进一步简化发票的流转、存储、查验&#xff0c;可以大幅降低纳税人领用、运输、存储和管理成本…

微信(QQ)截图时,无法保留鼠标右键菜单选项内容

问题描述 按下右键后弹出菜单&#xff0c;再按下QQ截图热键"Ctrl&#xff0b;Alt&#xff0b;A"&#xff08;微信"Ctrl&#xff0b;A"&#xff09;时&#xff0c;却发现菜单不见了。 微信的解决方法 先按下"Alt"键不放&#xff0c;再按住&quo…

js闭包的使用

js闭包的使用 学习了&#xff1a;https://www.cnblogs.com/ZinCode/p/5551907.html 终于用上了闭包&#xff0c;还是有些生涩&#xff1b;好像柿子还没熟&#xff1b; function createList(list, divObject) {for (var i 0; i < list.length; i) {var monitor list[i];var…

使用WebClient请求WCF REST服务

2019独角兽企业重金招聘Python工程师标准>>> 接上篇”WCF实现REST服务“&#xff0c;服务端有了&#xff0c;我们看看客户端怎么访问&#xff0c;由于JS跨域的限制&#xff0c;这里通过WebClient做在后台代理来访问&#xff0c;话不多说&#xff0c;直接上代码。 1…

python谁是卧底游戏流程图_虎牙小程序—谁是卧底 |明星互动游戏

主播连麦&#xff0c;观众互动每次都是唱歌跳舞聊天&#xff0c;你是否有为直播内容无吸引力而担心&#xff1f;别担心&#xff01;最经典的明星互动游戏“谁是卧底”终于来了&#xff0c;主播直播连麦就可以玩&#xff01;最重要的是&#xff01;&#xff01;&#xff01;观众…

Git的工作流程简介

目录Git的工作区域Git的基本流程1.将工作区的代码添加到暂存区2.将暂存区的文件提交到本地仓库3.将暂存区的文件提交到远程仓库Git的工作区域 Git的基本流程 图形化方式操作 命令行模式&#xff08;Linux系统常用&#xff09;操作 1.将工作区的代码添加到暂存区 查看文件状态使…

git常用配置(指令)

1、配置用户名和邮箱 (1) 指令设置 $ git config --global user.name "username" $ git config --global user.email johndoeexample.com (2) 修改配置文件.gitconfig 2、配置ssh key免密登录 (1) 生成密钥 $ ssh-keygen -t rsa -C 1046407517qq.com (2) 在github添加…

PG git pull

2019独角兽企业重金招聘Python工程师标准>>> remote: Counting objects: 347, done. remote: Compressing objects: 100% (159/159), done. remote: Total 159 (delta 136), reused 0 (delta 0) Receiving objects: 100% (159/159), 23.16 KiB, done. Resolving del…

c51单片机led奇数偶数亮_两STM32单片机串口通讯实验

一、实验思路连接两个STM32单片机的串口引脚&#xff0c;单片机A进行发送&#xff0c;单片机B进行接收。单片机B根据接收到单片机A的指令来点亮或熄灭板载LED灯&#xff0c;通过实验现象来验证是否通讯成功。二、实验器材两套STM32F103C8T6单片机开发板、ST-Link下载器、杜邦线…

Git本地仓库文件的创建、修改和删除

目录基本信息设置1.设置用户名2.设置用户名邮箱Git仓库操作介绍1.创建一个新的文件夹2.在文件内初始化git仓库&#xff08;创建git仓库&#xff09;3.向仓库中添加文件1.创建一个文件2.将文件添加到暂存区3.将暂存区添加到仓库4.修改仓库文件1.修改文件2.然后把文件添加到暂存区…

作业4

一.题目&#xff1a;求一个二维整数数组中最大子数组的和二.设计思想&#xff1a;假如有一个i行j列的二维数组&#xff0c;可以有正有负通过两个子函数实现(一.)通过上次的一位数组求最大值&#xff0c;可以先求出每一行最大连续子数组的和(二.)记下上下边界元素的下标(三.)每一…