一步一步写STL:空间配置器(1)

本文介绍了作者在研究STL源码的过程中,决定仿写一个STL并从空间配置器开始。文章详细讲解了STL中空间配置器的作用,包括其在内存管理中的关键地位,以及如何通过全局函数`operator new`和`operator delete`实现内存分配。作者还介绍了一个简单的Allocator类模板,展示了如何实现标准容器接口所需的基本功能,如内存分配、对象构造和析构等。
摘要由CSDN通过智能技术生成
侯捷说:追踪一流程序,并从中吸取养分,模仿着他写的程序,比那些自以为靠自己努力写出来的下三流程序价值高得多,至少我这么认为——世界上99.999%的程序,在STL面前都是下三流水平!

 

侯捷老师这句话对STL的评价太高了,以前只是熟练使用STL,知道一点原理,受他的影响,最终还是决定研究STL的源码,收益颇丰,还是把这个过程记录下来,并想着借助标准库的原理,自己写一个完整的仿STL,我觉得这是一个很大的工程,因为涉及到高级数据结构,强大的算法,泛型编程思维,STL的掌握,强大的C++编码水平,层次复杂的继承,型别萃取技术,相信这个过程会收益颇丰!毕竟我才大二,时间一大把,我想在我本科期间,做完这一个工程,也无憾了!

 

下图就是STL的层次分布图,当然还缺少一些组件,比如数值处理,pair对组,string,智能指针以及valarray数组等等,其中实现的难点主要集中在几个地方,分别是map红黑树的实现,heap算法体系,函数配接器,流迭代器。尤其是函数配接器,他的内部实现简直是穷尽一切顶尖技巧,令人叹为观止,我先从最左边的内存分配器开始,因为他是所有的核心!

 

 

首先STL的内存分配器(空间配置器)在标准库中充当了异常重要的角色,所有的内存分配,管理,释放都是由他控制,SGI的设计理念就是把内存管理这一块红灯区抽离出来,作为模版参数传递进去每个容器,

比如在vector:

template<class T,class Alloc<T> = allocator<T> >

class vector.........

他使用的是内置的默认内存分配器,在上图中我们看到有两个分配器,这是SGI STL中的高级之处,实作了多级内存分配,利用内存池实现效率上的优化,同时也减少了内存碎片的可能性。

在这之前需要知道两个全局函数 ::operator new 和 ::operator delete ,注意不要把他们和一般的new delete混为一谈,我们的运算符new在分配内存的时候同时调用对象的构造函数初始化内存,而::operator new只是分配内存,并不调用构造函数,这是实现一块无初始化内存池的关键点,同理delete。

另外还需要了解placement new运算符,他是定位运算符,并不分配内存,只是定位到某一已分配区域!

这里我们先实现一个能跟标准容器接口的分配器类,他并不高明,但是体现了标准分配器的必要特性,其实从某个角度说属于SGI版本的一级分配器:

  1. template<class _Ty>  
  2.     struct Allocator_base  
  3.     {   //配置器基类  
  4.     typedef _Ty value_type;  
  5.     };  
  6.   
  7. template<class _Ty>  
  8.     struct Allocator_base<const _Ty>  
  9.     {   //配置器特化于const的基类  
  10.     typedef _Ty value_type;  
  11.     };  
  12.   
  13. template<class _Ty>  
  14. class Allocator  
  15.         :public Allocator_base<_Ty>  
  16. {  
  17. public:  
  18.     //配置器内部型别  
  19.     typedef typename std::size_t size_type;  
  20.     typedef 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值