接近一年未更新博文,忙着适应工作环境,当然自己也变懒了不少。感觉还是得多抽时间充实自己,本文开始分析stl源码。
本系列分析的stl 版本为 sgi v3.3。
首先分析内存分配器,因为容器需要依赖内存分配器来实现。如最常用容器的定义:
1 2 3 4 5
| template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > class vector : protected _Vector_base<_Tp, _Alloc> {
|
这里的 __STL_DEFAULT_ALLOCATOR
定义为:
1 2 3 4 5 6 7
| # ifndef __STL_DEFAULT_ALLOCATOR # ifdef __STL_USE_STD_ALLOCATORS # define __STL_DEFAULT_ALLOCATOR(T) allocator< T > # else # define __STL_DEFAULT_ALLOCATOR(T) alloc # endif # endif
|
allocator
内部实现也为 alloc
, 所以本文分析的对象为 alloc
。
关于 alloc
的实现,文件目录为 allocator/stl_alloc.h
关于alloc
的定义有两种:(通过宏来开关是哪一种):
- 第一级配置器:
1 2
| typedef __malloc_alloc_template<0> malloc_alloc; typedef malloc_alloc alloc;
|
此时实际类为 __malloc_alloc_template
- 第二级配置器:
1
| typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc;
|
此时实际类为 : __default_alloc_template