标准模板库的空间配置器 STL's allocator
来源:互联网 发布:金融网络销售违法吗 编辑:程序博客网 时间:2024/05/16 10:41
标准模板库中利用空间配置器来在幕后管理内存空间。之所以叫空间配置器,是因为可能在某种情况下,可以在内存以外的介质比如硬盘上进行分配。不过一般来讲是内存,有下面两种空间配置器。
一种是标准的空间配置器,std:allocator
一种是高级的空间配置器,std:alloc
allocator配置器
allocator的内存管理方式是一种简单的空间配置,只是在直接的new/delete操作和模板库对象之间加了简单一层,封装起了直接的动态空间申请和释放操作。
实现过程大致如下所示:
template <class T>inline T* allocate(ptrdiff_t size, T*){set_new_handler(0);T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));if(tmp == 0){cerr<<"out of memory"<<endl;exit(1);}return tmp;}template <class T>inline void deallocate(T* buffer){::operator delete(buffer);}template <class T>class allocator{public:typedef T value_type;typedef T* pointer;typedef const T* const_pointer;typedef T& reference;typedef const T& const_reference;typedef size_t size_type;typedef ptrdiff_t difference_type;pointer allocate(size_type n){return ::allocate((difference_type)n, (pointer)0);}void deallocate(pointer p){::deallocate(p);}pointer address(reference x){return (pointer)&x;}const_pointer const_address(const_reference x){return (const_pointer)&x;}}
alloc配置器
alloc的内存管理方式要复杂的多,加入了自己设计的内存管理哲学,其目的是一方面为了避免内存碎片,另一方面也能减少系统调用的次数。
空间配置器分为两个层次。
第一级直接使用malloc/free来申请和释放堆空间,主要处理超过128字节的大对象;
使用malloc/free而不是C++的new/delete的原因主要是历史原因。
第二级利用内存池的方式来自治从内核申请来的空间,内存池中维护了16种不同尺寸的区块,每种区块组成自由链表,主要处理小于128字节的小对象。
空间配置函数allocate()
在分配空间时,先判断区块大小,如果超过128字节就直接用第一级的配置器;
否则的话,先寻找合适的slab尺寸,找到对应的空闲链表。
如果链表不空,就分配出一个结点;
如果为空,要重新为链表填充空间。新的空间是从内存池中取得的,内存池的作用就是为不同的空闲列表提供区块,当内存池空间不足时,也会动用第一级配置器来添加空间。
0 0
- 标准模板库的空间配置器 STL's allocator
- 标准模板库的空间配置器 STL allocator
- STL:allocator空间配置器
- STL之空间配置器allocator
- 【STL】SGI空间配置器 Allocator
- stl之空间配置器Allocator
- STL(一):allocator 空间配置器
- STL-空间配置器(allocator)
- STL 空间配置器 allocator<一>
- 空间配置器allocator
- 空间配置器allocator
- SGI STL 空间配置器(allocator)源码剖析
- STL源码学习之空间配置器allocator【2013.11.15】
- SGI STL 空间配置器(allocator)源码剖析
- STL学习笔记--2、空间配置器 allocator
- SGI STL学习笔记(1):空间配置器(allocator)
- STL源码剖析之空间配置器Allocator
- STL源码剖析 — 空间配置器(allocator)
- PERL 语言中的q,qw,qr,qx,qq
- 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)
- 应用smarty实现分页
- 学习 xss
- 求大神帮忙新手初学
- 标准模板库的空间配置器 STL's allocator
- SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
- leetcode第一刷_Single Number II
- WSGI 简介(使用python描述)
- 使用Vitamio打造自己的Android万能播放器(8)——细节优化
- 计算阶乘n!末尾的0的个数
- SIPp web frontend(1)
- SSH基本原理和免密码登录
- Leetcode:Search in Rotated Sorted Array