标准模板库的空间配置器 STL allocator

标准模板库中利用空间配置器来在幕后管理内存空间。之所以叫空间配置器,是因为可能在某种情况下,可以在内存以外的介质比如硬盘上进行分配。不过一般来讲是内存,有下面两种空间配置器。

一种是标准的空间配置器,std:allocator
一种是高级的空间配置器,std:alloc

allocator配置器

allocator的内存管理方式是一种简单的空间配置,只是在直接的new/delete操作和模板库对象之间加了简单一层,封装起了直接的动态空间申请和释放操作。
实现过程大致如下所示:
 
  1. template <class T> 
  2. inline T* allocate(ptrdiff_t size, T*) 
  3.     set_new_handler(0); 
  4.     T* tmp = (T*)(::operator new((size_t)(size * sizeof(T)))); 
  5.     if(tmp == 0) 
  6.     { 
  7.         cerr<<"out of memory"<<endl; 
  8.         exit(1); 
  9.     } 
  10.     return tmp; 
  11.  
  12. template <class T> 
  13. inline void deallocate(T* buffer) 
  14.     ::operator delete(buffer); 
  15.  
  16. template <class T> 
  17. class allocator 
  18. public
  19.     typedef T value_type; 
  20.     typedef T* pointer; 
  21.     typedef const T* const_pointer; 
  22.     typedef T& reference; 
  23.     typedef const T& const_reference; 
  24.     typedef size_t size_type; 
  25.     typedef ptrdiff_t difference_type; 
  26.  
  27.     pointer allocate(size_type n) 
  28.     { 
  29.         return ::allocate((difference_type)n, (pointer)0); 
  30.     } 
  31.  
  32.     void deallocate(pointer p) 
  33.     { 
  34.         ::deallocate(p); 
  35.     } 
  36.  
  37.     pointer address(reference x) 
  38.     { 
  39.         return (pointer)&x; 
  40.     } 
  41.  
  42.     const_pointer const_address(const_reference x) 
  43.     { 
  44.         return (const_pointer)&x; 
  45.     } 

alloc配置器

alloc的内存管理方式要复杂的多,加入了自己设计的内存管理哲学,其目的是一方面为了避免内存碎片,另一方面也能减少系统调用的次数。

空间配置器分为两个层次。
第一级直接使用malloc/free来申请和释放堆空间,主要处理超过128字节的大对象;
使用malloc/free而不是C++的new/delete的原因主要是历史原因。

第二级利用内存池的方式来自治从内核申请来的空间,内存池中维护了16种不同尺寸的区块,每种区块组成自由链表,主要处理小于128字节的小对象。

空间配置函数allocate()
在分配空间时,先判断区块大小,如果超过128字节就直接用第一级的配置器;
否则的话,先寻找合适的slab尺寸,找到对应的空闲链表。
如果链表不空,就分配出一个结点;
如果为空,要重新为链表填充空间。新的空间是从内存池中取得的,内存池的作用就是为不同的空闲列表提供区块,当内存池空间不足时,也会动用第一级配置器来添加空间。

 


 

1 STL 简介 ..............................................................................................................................................2 2 顺序性容...........................................................................................................................................2 2.1 C++ VECTOR(向量容) ...........................................................................................................2 2.2 C++ LIST(双向链表) .................................................................................................................4 2.3 C++ DEQUE(双向队列) ..................................................................................................................6 2.4 三者比较........................................................................................................................................8 3 关联容...............................................................................................................................................8 3.1 特点................................................................................................................................................8 3.2 C++ SETS & MULTISETS .................................................................................................................9 3.3 C++ MAPS & MULTIMAPS ............................................................................................................ 11 4 容适配.........................................................................................................................................12 4.1 特点..............................................................................................................................................12 4.2 C++ STACKS(堆栈) ..................................................................................................................13 4.3 C++ QUEUES(队列) ......................................................................................................................13 4.4 C++ PRIORITY QUEUES(优先队列)...............................................................................................13 5 迭代.................................................................................................................................................14 5.1 解释..............................................................................................................................................14 5.2 功能特点......................................................................................................................................14 6 C++标准总结..................................................................................................................................15 6.1 容..............................................................................................................................................15 6.2 算法..............................................................................................................................................15 6.3 函数对象......................................................................................................................................17 6.4 迭代..........................................................................................................................................19 6.5 分配..........................................................................................................................................19 6.6 数值..............................................................................................................................................19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值