我们在c++中创建数组通常使用new来分配我们需要的内存大小,之后通过delete进行释放内存

但是我们调用new的时候,通过调用的是operator new,二operator new调用的是malloc,所以我们说new的本质其实就是malloc,只不过我们看不到而已,同样,delete调用operator delete ,进而调用free

我们通常会告诉编译器我们需要多大的内存空间,也就是传一个size参数,但是编译器所开辟的空间就不知size那么大了,他开辟的空间比size的,如上图,我们malloc size的大小,但是编译器确为我们开辟上面那么多的内存空间,这样反应了一个问题,如果我们的ssize很小,那么额外空间所占的比例就大,如果我们开辟的空间小,那么额外空间所占的比例就小,我们在这里不能说额外空间有多浪费,或者具体有多大,我们只能研究他所占的比例相对于一次malloc所有的内存占得大小而已,这额外空间中,有两个是必须就是上图边界的两个紫色部分,这叫做cookie,最上面的cookie里面存着整个空间的大小,方便我们delete的时候,我们直接通过首地址释放cookie里面存的大小内存就可以了,提高效率

上面大家可以看到各种容器使用的也都是allocator,这个源代码是VC,BC通用的(大致相同),allocator的原理和new是一样的,也是调用operator new,进而调用malloc,相同,deallocator 调用的是operator delete,进而调用free

同时,因为我们看到了源代码,所以我们可以手动使用分配器

int *p=allocaort<int>()._Allocator(10,(int *)0);

allocaort<int>().deallocator(p,10);

allocaort<int>()的意思就是一个对象allocator<int>制定了模板类,加上()其实就变成了一个临时的object

*************************************************************************************

GCC2.9

上面大家可以看到在gcc2.9编译器中,默认使用的分配器不是allocator,而是alloc,why?

实际上在gcc2.9中allocator仍然还是存在的,只不过编译器不用,使用alloc,当时认为alloccator过于浪费,因为每次malloc需要分配内存的时候,分配的内存都有很多的额外的内存开销,所以,alloc产生了,alloc的结构如下,他有16个连续·的链表,每一个指向一段内存空间,第一个指向8个字节的,第二个指向16个字节,依次类推,分别增加8个,当编译器malloc的时候,加入需要50个。他会找到底7个位置,开辟56个内存,这样的话就不必要那么多额外的空间消费,,,,,,,,但是到gcc4.9又开始默认使用allocator,

gcc4.9又开始使用allocator但是变了,源代码中allocator继承了alloccator base,但是define宏定义发现,他是newallocator,内部又是allocator,之后operator new, 进而malloc,本质还是malloc,但是alloc并没有删除,他被应用到了一些其他的分配器中,比如最后一张图,他被分配到了——poll allocator之中

各类编译器 allocator 底层的更多相关文章

  1. malloc函数的底层实现你是否清楚

    malloc函数的底层实现你是否清楚 说起malloc函数,每个人都能说出它的功能,而且我们经常会用到,那么今天我要说的是关于malloc函数在编译器的底层实现,如果你对它的实现已经很清楚了,那么你可 ...

  2. 《C++Primary》阅读简要总结

    三月份的主要任务之一就是阅读C++Primary这本书,终于在昨天25号下午完成了基础部分的阅读,算是对基础知识整体梳理了一遍,开始看这本书大概可以追溯到去年12月份,在那之前看了C++的入门书籍&l ...

  3. 异步编程系列第01章 Async异步编程简介

    p { display: block; margin: 3px 0 0 0; } --> 2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译.过段时间,我将重新翻 ...

  4. 资深人士剖析微软开源.NET事件:战略重心已经从PC转移到云端

    本文是雷锋网对我的访谈整理的文章,源地址是 http://www.leiphone.com/news/201411/6KaGhD7PDABnvrRf.html 2014年11月13日,微软表示开源.N ...

  5. 异步编程系列第02章 你有什么理由使用Async异步编程

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  6. 异步编程系列第04章 编写Async方法

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  7. 异步编程系列第05章 Await究竟做了什么?

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  8. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  9. 内存屏障 & Memory barrier

    Memory Barrier http://www.wowotech.net/kernel_synchronization/memory-barrier.html 这里面讲了Memory Barrie ...

随机推荐

  1. Bash shell 的算术运算有四种方式

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1:使用 expr 外部程式加法 r=`expr 4 + 5`echo $r注意! '4' '+' '5' 这三者之间要有空白r=`e ...

  2. CSDN泄漏数据完整分析

    CSDN泄漏数据完整分析 2011-12-22 08:59:26 53391 次阅读 0 条评论 感谢mayee的投递 昨天CSDN的用户数据库被人在网上公布.我下载分析了下里面的数据,得出了一些很有 ...

  3. layer 的一些知识

    layer类似于ps的图层,如果把一个uiview看做图片的画,layer就像是图层.一个图片是由很多个大小不同的有层次的图层构成的,uiview也是. 1. 一个view有一个underlying ...

  4. poj1328贪心中的区间问题

    题意:给定海岛个数.雷达半径以及各海岛坐标,求能覆盖所有海岛的最小雷达数. 思路:先对每个海岛求一个区间:即能覆盖它的所有雷达的圆心所构成的区间.然后对区间排序,定义一个最右点over,依次延伸ove ...

  5. 学习vi(1)

    原文地址:http://www.gentoo.org/doc/zh_cn/vi-guide.xml#doc_chap2 1.  新手上路 介绍 本教程将会向你展示如何使用vi──一个强大的可视化编辑器 ...

  6. LPC2478的硬件IIC使用

    LPC2478的IIC使用 LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示, 简单 ...

  7. 远程开户系统开放API接口

    如今随着智能识别技术的成熟和商用,金融领域也开始逐渐试水"远程开户".从OCR身份证识别到人脸识别,到如今市场上即将出现完整的远程开户系统,除了需要成熟的技术做支撑外,还需要对市场 ...

  8. wordpress-标签

    来源1:http://www.graphicrating.com/2009/01/18/my-wordpress-cheat-sheet/ 来源2:http://www.cnblogs.com/asq ...

  9. html&&css 基础知识笔记

    diV有 Class.Style.title.ID 等属性. 1.margin 空出边缘 margin:上 下 左 右(按顺时针顺序,缺少某一方向则对称) 2.border 边框(三要素:像素 形状 ...

  10. 字符集UTF-8MB4 MySQL utf8mb4 字符集,用于存储emoji表情

    字符集UTF-8MB4 utf8mb4兼容utf8,且比utf8能表示更多的字符.看unicode编码区从1 - 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8m ...