我们在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. 程序ajax请求公共组件app-jquery-http.js中url参数部分的项目应用

    结合微信登录以及微信支付的案例:= =||| (案例比较奇葩复杂) 简述项目流程: 1.获取用于公众号支付的openid(公众平台):在微信内置浏览器中打开网页链接,刚进入页面就通过微信公众平台获取该 ...

  2. FZU 1061 矩阵连乘

    用栈来算一算就可以了. #include<iostream> #include<algorithm> #include<cstdio> #include<cs ...

  3. android NDK编译(导入).a文件和编译多个so文件(转)

    源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include ...

  4. 绕过网站安全狗拦截,上传Webshell技巧总结(附免杀PHP一句话)

    这篇文章我介绍一下我所知道的绕过网站安全狗上传WebShell的方法. 思路是:修改HTTP请求,构成畸形HTTP请求,然后绕过网站安全狗的检测. 废话不多说,切入正题.... 1.实验环境: Win ...

  5. 七 APPIUM Android 定位方式

    1.定位元素应用元素   1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement element = driver.findElem ...

  6. vimplugin破解

    必较常用的vi插件有:viplugin.Vrapper.eclim Vrapper没有用过,eclim在公司电脑上装,总是不能正常的连接gvim,所以也没有用 Viplugin,常用功能基本都有... ...

  7. Spring 之 配置(Java之负基础实战)

    1.程序加入Spring <?xml version="1.0" encoding="utf-8"?> <web-app xmlns=&quo ...

  8. Bootstrap3写的红色警告框样式组件

    用的是BT3的类和fa的图标 <!DOCTYPE html><html><head lang="en">    <meta charset ...

  9. Delphi 中的常用事件

    OnActive 焦点称到窗体或控件时发生 OnClick 鼠标单击事件 OnDbClick 鼠标双击事件 OnClose和OnCloseQuery 当关闭一个窗体时就会响应OnClose和OnClo ...

  10. --@angularJS--指令与控制器之间较复杂的交互demo2

    1.index.html: <!DOCTYPE HTML><html ng-app="app"><head>    <title>c ...