1. 前言 天下大事,必作于细。 源码之前,了无秘密。 你清楚下面这几个问题吗? 当你调用 new 和 delete 时编译器底层到底做了哪些工作? STL 各大容器底层空间配置原理是怎样的? STL 空间配置器到底要考虑什么? 什么是内存的配置和释放? … 这篇,我们就来回答这些问题。 2. STL 六大组件 在深入配置器之前,我们有必要了解下 STL 的背景知识: 标准模板库(英文:Standard Template Library,缩写:STL),是一个 C++ 软件库。 STL 的价值在于两个方面,就底层而言,STL 带给我们一套极具实用价值的零部件以及一个整合的组织;除此之外,STL 还带给我们一个高层次的、以泛型思维 (Generic Paradigm) 为基础的、系统化的“软件组件分类学”。 STL 提供六大组件,了解这些为接下来的阅读打下基础。 1、容器(containers):各种数据结构,如 vector, list, deque, set, map 用来存放数据。从实现的角度来看,STL 容器是一种 class template。 2、算法(algorithms):各种常用的算法如 sort, search, copy, erase…从实现角度来看,STL 算法是一种 function template。 3、迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。从实现角度来看,迭代器是一种将 operator *, operator ->, operator++, operator– 等指针相关操作予以重载的class template。 4、仿函数(functors):行为类似函数,可以作为算法的某种策略。从实现角度来看,仿函数是一种重载了 operator() 的 class 或class template。 5、适配器(adapters):一种用来修饰容器或仿函数或迭代器接口的东西。例如 STL 提供的 queue 和 stack,虽然看似容器,其实只能算是一种容器适配器,因为它们的底部完全借助 deque,所有操作都由底层的 deque 供应。 6、配置器(allocator):负责空间配置与管理,从实现角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的 class template。 初学作图,有点丑,还能看,嘿嘿 3. 何为空间配置器 3.1 为何需要先了解空间配置器? 从使用 STL 层面而言,空间配置器并不需要介绍 ,因为容器底层都给你包装好了,但若是从 STL 实现角度出发,空间配置器是首要理解的。 作为 STL 设计背后的支撑,空间配置器总是在默默地付出着。为什么你可以使用算法来高效地处理数据,为什么你可以对容器进行各种操作,为什么你用迭代器可以遍历空间,这一切的一切,都有“空间配置器”的功劳。 3.2 SGI STL 专属空间配置器 SGI STL 的空间配置器与众不同,且与 STL 标准规范不同。 其名为 alloc,而非 allocator。 虽然 SGI 也配置了 allocatalor,但是它自己并不使用,也不建议我们使用,原因是效率比较感人,因为它只是在基层进行配置/释放空间而已,而且不接受任何参数。 SGI STL 的每一个容器都已经指定缺省的空间配置器是 alloc。 在 C++ 里,当我们调用 new…