任何容器的构建都离不开分配器,分配器顾名思义就是分割配置内存资源的组件,分配器的效率直接影响力容器的效率。

operator new()和malloc()

C/C++底层都是通过malloc()调用系统的API来为程序申请内存。

每次申请内存时,malloc()函数实际上会多分配一些空间,这些空间并不能被程序实际使用(例上图分配的size内存上下即为没有被程序使用的overload部分的内存),malloc()申请的内存越大,overload占的比例越小,malloc()申请的内存越小,overload占的比例越大。

这是设计的原因是为了实现malloc的通用性而做的必要牺牲(即申请内存的随机性和大小的不确定性),由于在归还内存时仅仅提供一个指针,所以overload部分记录的是申请的区块内存大小,以便free的时候能够精确地回收内存。

VC6标准的容器默认都是使用allocater作为分配器

从下面的allocator的调用我们可以看出来,allocator实际上就是用operator new()来申请(即用malloc申请)内存

右边圆框圈起来的代码就是直接用allocator申请和释放内存的例程,他通过allocator<int>()产生了一个无名的临时对象,调用其内部的allocate方法申请512个int*类型的空间,然后在归内存时也相同用无名临时对象归还p指针所指的512大小的内存,由于其接口设计总要记住内存大小,所以使用较少。(话说用无名临时对象这种语法也不常见呢,尤其像这种显式的声明)

BC和GCC2.9中实现的allocator基本一致,但是在GCC2.9的代码注释中,它们有说明自己也没有使用自己的allocator,而是使用了SGI。

上面我们提到了,malloc申请内存的弊端,即overload的冗余过多,所以,在STL设计的时候使用的为alloc,这是一种针对STL专门的空间配置器。

由于容器中数据的规整性(例如一个容器确定了数据类型,则其在申请内存时就比较明确),所以alloc设计采用了16长的链表,第0条为8字节,第1条为16字节,第2条为24字节.....第15条为168字节,当容器需要内存时,就从链表中选择合适的一个给它。(虽然这个带内存的链表也是使用malloc申请的内存,但是它已经大大节省了overload,这就是内存池)

然而,在G4.9又使用了operator new的这种低效版本。

分配器——allocators的更多相关文章

  1. STL之分配器allocator

    简单介绍下STL中的分配器allocators. allocators我们一般不会直接接触到,甚至可能并不清楚它的存在,简单的来说,它就是一个幕后工作者,我的印象中它的作用主要在于为容器分配一定的空间 ...

  2. 【STL学习笔记】一、STL体系

    目录 1.标准库以header files形式呈现 2.namespce命名空间 3.STL与OO 4.STL六组件及其关系 5.STL组件例子 6.range-based for statement ...

  3. STL之内存管理

    STL以泛型思维为基础,提供了6大组件:容器(containers).算法(algorithms).迭代器(iterators).仿函数(functors).适配器(adapters).分配器(all ...

  4. Linux内存管理 (5)slab分配器

    专题:Linux内存管理专题 关键词:slab/slub/slob.slab描述符.kmalloc.本地/共享对象缓冲池.slabs_partial/slabs_full/slabs_free.ava ...

  5. 理解 glibc malloc:主流用户态内存分配器实现原理

    https://blog.csdn.net/maokelong95/article/details/51989081 Understanding glibc malloc 修订日志: 2017-03- ...

  6. 侯捷STL学习(三)--分配器测试

    第七节:分配器测试 标准的分配器Allocator,#include<ext/...>都是拓展的 可以用不同的分配器测试同一容器 分配器allocate() & deallocat ...

  7. 内存分配器 (Memory Allocator)

    对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...

  8. Slab 分配器

    1.什么是Slab 分配器: 以下摘自维基百科:https://en.wikipedia.org/wiki/Slab_allocation Slab  firstly introduced in ke ...

  9. Allocators与Criterion的相同点及区别

    C++98: 1.相同点: Allocators having the same type were assumed to be equal so that memory allocated by o ...

随机推荐

  1. 痞子衡嵌入式:借助Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页编程执行时间

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列FlexSPI驱动Flash页编程执行时间. 痞子衡之前写过一篇文章 <串行NOR Flash的页编程模式对于量产 ...

  2. MySql表、约束、视图

    MySql表.约束.视图 索引组织表 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表成为索引组织表(index organized table). 每张表都有主键,如果创建表 ...

  3. 端口被占用(启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法)

    一.问题描述 在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误: 错误: 代理抛出异常错误**: java.rmi.server.ExportException: Po ...

  4. 『与善仁』Appium基础 — 7、ADB Shell命令的使用

    目录 1.查看进程 2.查看实时资源占用情况 3.查看进程 UID 4.其它ADB Shell命令说明 Android系统是基于 Linux 内核的,也就是说Android系统的底层是Linux系统. ...

  5. (三)MySQL数据管理

    3.1 外键(了解即可) 方式一:在创建表的时候,增加约束(麻烦,比较复杂) CREATE TABLE IF NOT EXISTS `student`( `id` INT(4) NOT NULL AU ...

  6. LINKERD 2.11 中文实战手册

    1. 将您的服务添加到 Linkerd. 为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理注入到它们的 pod 中来进行 网格化 . 2. 自动化的金丝雀发布. 通 ...

  7. Spark面试题(五)——数据倾斜调优

    1.数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈. 数据倾斜俩大直 ...

  8. [bzoj1305]跳舞

    考虑如果没有k个人,那么就是裸的二分答案+最大流对于这k个人,再在原来的每一个点裂点,中间的流量为k,然后裂出来的点向所有不能匹配的点连边,再二分答案+最大流即可 1 #include<bits ...

  9. c语言是如何处理函数调用的?

    1.  要编译的测试代码: int plus(int x, int y) { return x + y; } int main(void) { return plus(3, 4); } 2. main ...

  10. 明明pip安装python的模块了,pycharm还是找不到的解决方案

    以前pycharm的安装包和python的环境一直都不能融合在一起,到了今天才知道,原来他们都是有自己的工作环境的 自己的工作环境(虚拟解释器)和安装python的工作环境(基本解释器)不是一个环境, ...