STL源码剖析——空间配置器

本文深入剖析STL中的空间配置器,包括第一级配置器__malloc_alloc_template的异常处理和第二级配置器__default_alloc_template的内存池管理。详细解释了内存配置函数allocate()、释放函数deallocate()、内存池管理机制以及多线程环境下的内存池互斥访问策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

    SGI STL源码下载地址

    空间配置是为存储数据提供可用的空间,在Standard Template Library(STL)中,空间配置是最底层的东西,为容器提供服务。在C++中,一般管理内存分配是使用newdelete进行操作,这两个操作都需要经过两个步骤;

new操作的步骤:(1)调用::operator new配置内存;(2)调用对象的构造函数构造对象并初始化。

delete操作步骤:(1)调用对象的析构函数析构对象;(2)调用::operator delete释放内存。例如:

class Foo { ... };
Foo* pf = new Foo;
...
delete pf;

    而在STL中,空间配置在C++的基础上增加了一些特性。STL allocator 将这两个阶段分开操作,内存配置操作由空间配置器stl::alloc中的alloc::allocate(),内存释放由alloc::deallocate()负责;对象构造操作由::construct()负责,对象析构操作由::destroy()负责。SGI STL中考虑到了异常处理,内置轻量级内存池(主要用于处理小块内存的分配,应对内存碎片问题)实现,多线程中的内存分配处理(主要是针对内存池的互斥访问)等。

空间配置器的标准接口

    在SGI STL中,空间配置器(Allocator)的主要实现文件是alloc.hstl_alloc.h,标准接口位于文件stl_alloc.h588-628行;具体如下:

/*tihs program is in the file of stl_alloc.h from line 588 to 628 */

template <class _Tp>
class allocator {
  typedef alloc _Alloc;          // The underlying allocator.
public:							//数据类型的成员变量在后续章节(traits编程技巧)介绍
  typedef size_t     size_type;
  typedef ptrdiff_t  difference_type;
  typedef _Tp*       pointer;
  typedef const _Tp* const_pointer;
  typedef _Tp&       reference;
  typedef const _Tp& const_reference;
  typedef _Tp        value_type;

  template <class _Tp1> struct rebind {//嵌套一个template,且仅包含唯一成员other,是一个typedef;
    typedef allocator<_Tp1> other;
  };
  //下面是成员函数
  allocator() __STL_NOTHROW {}	//默认构造函数,__STL_NOTHROW在 stl_config.h中定义,要么为空,要么为 throw()异常机制
  allocator(const allocator&) __STL_NOTHROW {}	//复制构造函数
  template <class _Tp1> allocator(const allocator<_Tp1>&) __STL_NOTHROW {}//泛化的复制构造函数
  ~allocator() __STL_NOTHROW {}//析构函数

  pointer address(reference __x) const { return &__x; }//返回对象的地址
  const_pointer address(const_reference __x) const { return &__x; }//返回const对象的地址

  // __n is permitted to be 0.  The C++ standard says nothing about what
  // the return value is when __n == 0.
  _Tp* allocate(size_type __n, const void* = 0) {// 配置空间,如果申请的空间块数不为0,那么调用 _Alloc 也即 alloc 的 allocate 函数来分配内存,
 //这里的 alloc 在 SGI STL 中默认使用的是__default_alloc_template<__NODE_ALLOCATOR_THREADS, 0>这个实现(见第402行)
    return __n != 0 ? static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp))) 
                    : 0;
  }

  // __p is not permitted to be a null pointer.
  void deallocate(pointer __p, size_type __n)//释放已配置的空间
    { _Alloc::deallocate(__p, __n * sizeof(_Tp)); }

  size_type max_size() const __STL_NOTHROW //返回可成功配置的最大值
    { return size_t(-1) / sizeof(_Tp); }

  void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }//构造,等同于new ((void*)p) T(x)
  void destroy(pointer __p) { __p->~_Tp(); }//析构,等同于p->~T()
};

    在SGI STL的的stl_alloc.h文件中,可以看到有以下几种空间配置的类模板:

template <int __inst> class __malloc_alloc_template 
// Malloc-based allocator.  Typically slower than default alloc
typedef __mal
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值