搜狐首页 科技 画心师

手机搜狐

SOHU.COM

C++ STL 内存配置的设计思想与关键源码分析

(点击上方公众号,可快速关注)

来源:QingLiXueShi,2015-04-28

www.cnblogs.com/mengwang024/p/4461116.html

如有好的文章投稿,请点击 → 这里查看详情;

说明:我认为要读懂STL中allocator部分的源码,并汲取它的思想,至少以下几点知识你要了解:operator new和operator delete、handler函数以及一点模板知识。否则,下面你很可能看不大明白,补充点知识再学习STL源码比较好。

下面会结合关键源码分析C++STL(SGI版本)的内存配置器设计思想。关键词既然是“思想”,所以重点也就呼之欲出了。

1、allocator的简短介绍

我阅读的源码是SGI公司的版本,也是看起来最清楚的版本,各种命名最容易让人看懂。allocator有人叫它空间配置器,因为空间不一定是内存,也可以是磁盘或其他辅助存储介质。我说的内存配置就是指的allocator。

C++标准规范了allocator的一些必要接口,由各个厂家实现。SGI的版本与众不同,也与标准规范不同,它的名称是alloc而不是allocator,且不接受任何参数。

假设你在程序中显示写出allocator,不能像下面这样写:

vectorint, std::allocatorint iv; //错误的

必须要这样写才对:

vectorint, std::alloc iv //好的

虽然SGI STL并不符合规范,但我们用起来好像很自然。这是因为我们使用时空间配置器是缺省的,不需要我们自行指定。例如,STL中vector的声明如下:

注意:下文我基本就用截图来解释代码了,因为我发现比起粘贴代码,这样更清晰(有颜色对比)。

2、源码文件简单介绍

STL标准规定:STL的allocator定义于文件中,主要包含了一些头文件,我们主要说的是两个:

stl_alloc.h负责内存空间的配置与释放;stl_construct.h负责对象内容的构造与析构

3、构造和析构工具:construct()和destroy()

先来说一下简单的文件。这部分也不涉及什么思想,只是有一个版本的destroy()应该认真看看。

(1)构造工具:construct()

construct()只有一个版本:

精选