我们在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. CI分页器pagination的原理及实现

    以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 下面这段代码是从官网上翻译过来的,介绍了分页的用例 1 2 3 4 5 6 ...

  2. 3505: [Cqoi2014]数三角形

    3505: [Cqoi2014]数三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1324  Solved: 807[Submit][Statu ...

  3. html页面头部里的meta

    作者:zccst html中的http-equiv属性应用详解 一.简介 http-equiv 属性 -- HTTP协议的响应头报文 此属性出现在meta标签中 此属性用于代替name,HTTP服务器 ...

  4. FreeRTOS基础以及UIP之协程--C语言剑走偏锋

    在FreeRTOS中和UIP中,都使用到了一种C语言实现的多任务计数,专业的定义叫做协程(coroutine),顾名思义,这是一种协作的例程, 跟具有操作系统概念的线程不一样,协程是在用户空间利用程序 ...

  5. JS利用短路原理简写if语句

    看GoogleDoodle-Dance的源代码,学习到一个小知识——简写if语句. 几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不会去处理第二 ...

  6. MIPI-1

    未来的产品都将朝着移动的方向发展,例如智能手机.数码相机.摄像机.平板电脑.媒体播放器.游戏机等,这些产品需要能执行多任务,包括处理多个不同的传感器如麦克风.图像传感器.磁罗盘.三轴加速度计和精细的触 ...

  7. pageX,clientX,screenX,offsetX区别

    pageX/pageY:鼠标相对于整个页面的X/Y坐标.注意,整个页面的意思就是你整个网页的全部,比如说网页很宽很长,宽2000px,高3000px,那pageX,pageY的最大值就是它们了.特别说 ...

  8. 【ural1297】 Palindrome

    http://acm.timus.ru/problem.aspx?space=1&num=1297 (题目链接) 题意 求最长回文子串 Solution 后缀数组论文题 穷举每一位,然后计算以 ...

  9. Servlet_ResponseHeader

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  10. thinkPHP的学习

    1.版本,以3.1为主,因为手册是基于这个的,最新的版本,还没有对应的手册 2.发现一个问题,echo 中文时,出现乱码,而调用模版则正常. 3.写url的注意大小写.index和Index是不同的 ...