分配器——allocators
任何容器的构建都离不开分配器,分配器顾名思义就是分割配置内存资源的组件,分配器的效率直接影响力容器的效率。
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的更多相关文章
- STL之分配器allocator
简单介绍下STL中的分配器allocators. allocators我们一般不会直接接触到,甚至可能并不清楚它的存在,简单的来说,它就是一个幕后工作者,我的印象中它的作用主要在于为容器分配一定的空间 ...
- 【STL学习笔记】一、STL体系
目录 1.标准库以header files形式呈现 2.namespce命名空间 3.STL与OO 4.STL六组件及其关系 5.STL组件例子 6.range-based for statement ...
- STL之内存管理
STL以泛型思维为基础,提供了6大组件:容器(containers).算法(algorithms).迭代器(iterators).仿函数(functors).适配器(adapters).分配器(all ...
- Linux内存管理 (5)slab分配器
专题:Linux内存管理专题 关键词:slab/slub/slob.slab描述符.kmalloc.本地/共享对象缓冲池.slabs_partial/slabs_full/slabs_free.ava ...
- 理解 glibc malloc:主流用户态内存分配器实现原理
https://blog.csdn.net/maokelong95/article/details/51989081 Understanding glibc malloc 修订日志: 2017-03- ...
- 侯捷STL学习(三)--分配器测试
第七节:分配器测试 标准的分配器Allocator,#include<ext/...>都是拓展的 可以用不同的分配器测试同一容器 分配器allocate() & deallocat ...
- 内存分配器 (Memory Allocator)
对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...
- Slab 分配器
1.什么是Slab 分配器: 以下摘自维基百科:https://en.wikipedia.org/wiki/Slab_allocation Slab firstly introduced in ke ...
- Allocators与Criterion的相同点及区别
C++98: 1.相同点: Allocators having the same type were assumed to be equal so that memory allocated by o ...
随机推荐
- 用tsc编译ts文件的时候报错,tsc : 无法加载文件,因为在此系统上禁止运行脚本;
用tsc编译ts文件的时候报错,tsc : 无法加载文件,因为在此系统上禁止运行脚本:SecurityError 在vscode的控制台或者Windows PowerShell中用tsc命令编译ts文 ...
- [转]技术往事:改变世界的TCP/IP协议
原文链接 : http://www.52im.net/thread-520-1-1.html 1.前言 作为应用层开发人员,接触最多的网络协议通常都是传输层的TCP(与之同处一层的另一个重要协议是UD ...
- selenium2.x 与 selenium3.x 最大区别
一.selenium2.x 与 selenium3.x 最大区别 (1) 从3.0版本selenium开始使用火狐浏览器完成web自动化就需要用到驱动包了. (2) 而2.0版本的selenium使用 ...
- NAT & 防火墙
NAT 网络地址转换 NAT产生背景 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联 ...
- dotnet 6 使用 CreateSymbolicLink 创建文件夹符号链接
本文告诉大家如何使用 dotnet 6 提供的 Directory.CreateSymbolicLink 和 File.CreateSymbolicLink 方法创建文件夹和文件的符号链接 Direc ...
- LeetCode-40. 组合总和 II C++(回溯法)
回溯法本身是种暴力解法,虽然效率之类的比较低,但是写起来比较易懂和快.在提交之后的排名也挺低的,大概就超过8%左右.以后复习的时候再去看看题解,看看更高性能的算法.这里先暂时贴上回溯法的代码. 最后说 ...
- Python3使用request/urllib库重定向问题
禁止自动重定向 python3的urllib.request模块发http请求的时候,如果服务器响应30x会自动跟随重定向,返回的结果是重定向后的最终结果而不是30x的响应结果. request是靠H ...
- [python]django的mode设置表结构和serializers序列化数据
框架使用的库版本 python3.6.5 Django-2.0.6 djangorestframework-3.8.2 mysqlclient-1.3.12 1.项目结构声明,数据库在setting. ...
- Celery Received unregistered task of type
celery -A proj worker --loglevel=info 这个错误原因在于proj这里没有包含对应的task, 可以在这里导入需要的task即可
- 【JAVA】编程(4)---摇色子
作业要求: 利用" Math.random ( ) "生成随机数的方法来模拟同时摇三个色子获得的点数:点数的多少不同,也会导致不同的输出结果:可适当对程序增添一些更有趣的功能: ...