1、 符合STL标准的空间配器接口

STL是c++中使用非常广泛的一个标准库,它包含各种有用的容器。而空间配置器作为STL各种容器的背后的核心,负责容器内部内存的分配和释放。不过空间配置器可以分配的也不只是内存,因为空间也意味着可以是磁盘或者其他存储介质。下边是一个符合STL规范的空间配置器的必要接口:

allocator::value_type

allocator::pointer

allocator::const_pointer

allocator::reference

allocator::const_reference

allocator::size_type

allocator::difference_type

//上边这几个都是一些typedef定义,其中 size_type 和difference_type是stddef.h中 size_t, ptrdiff_t这两个类型的类型别名(ptrdiff_t是两个指针相减的结果)

allocator::rebind

allocator::allocator

allocator::allocator(const allocator&)

template<class U>

allocator::allocator(const allocator(U)&)

//泛化的拷贝构造函数

allocator::~allocator()

pointer allocator::address(reference X) const

const_pointer allocator::address(const_reference X)const

pointer allocator::allocator(size_type n, const void* = 0)

void allocator::deallocate(pointer p, size_type n)

//归还先前配置的空间

size_type allocator::max_size() const

void allocator::construct(pointer p, const T& x)

void allocator::destrory(pointer p)

2、 SGI空间配置器

SGI STL的配置器与标准规范不同,其名称是alloc而不是allocator,而且不接受任何参数。如果在程序中需要明确使用SGI的配置器,我们不能采用标准写法:

vector<int, std::allocator<int> > v

需要这么写:

vector<int, std::alloc> v

通常情况下,我们使用的stl中的容器都是用标准配置器,而SGI STL的每一个容器都已经指定其缺省空间配置器为alloc,如:

template <class T, class Alloc=alloc>

class vector {…}

2.1 标准空间配置器

SGI STL也有一个符合标准,名为allocator的配置器,但SGI从未使用过它,因为它效率太低,只是对::operator new, ::operator delete的简单封装而已;下边我着重介绍SGI特殊的配置器alloc。

2.2 SGI特殊空间配置器, std::alloc

C++中,我们在申请内存和释放内存的时候,一般这样做:

class Foo{}

Foo* f = new Foo

delete f

这其中new操作符内部含有两阶段操作,(1)调用new申请内存, (2)调用Foo:Foo()即对象的构造函数构造对象内容。

delete也含有两段操作:(1)调用Foo::~Foo()将对象析构, (2) 调用delete 释放内存。

为了精密分工也更有效的利用内存,SGI alloc将这两个阶段分开来操作。内存配置有alloc::allocator()负责内存配置,alloc::deallocator()负责内存释放;::constructor()负责构造对象;::destrory负责析构对象。

2.3内存配置后对象的构造与内存释放前对象的析构工具: constructor()和destrory()

这两个函数为全局函数,符合stl规范。

constructor()接受一个指针p和一个初值,该函数的作用是将初值设定到指针所指的内存空间上

template<class T1, class T1>

inlie void destructor(T1 *p, const T2 &value) {

new (p) T1(value) //placement new 在一个已经分配的内存中创建对象

}

destroy()函数有两个版本,一个版本接受一个指针参数,直接调用这个指针所指对象的析构函数析构对象。

template<class T>

inline void destroy(T* pointer){

pointer->~T();

}

另外一个版本接受两个迭代器,

template<class ForwardIterator, class T>

inline void destroy(ForwardIterator first, ForwardIterator last, T*) {

}

destroy函数实现的有点复杂,他先获取到迭代器所指对象的的类型,然后在看对象是否有trivial destructor, 如果有,调用一个什么也不做的版本;如果有non-trivial destructor,则遍历迭代器中的每一个对象,然后依次调用其析构函数。

(这里主要是处于效率考虑, 如果一个对象的析构函数没有任何作用,那么循环调用这个函数对效率是一种伤害)。

备注:

什么是trivial destructor呢?举个例子来说,存在A,B两个类,其中类B含有一个数据成员C,C有析构函数需要释放一些内存;那么在这种情况下,A就含有trivial destructor, 而B则含有non-trivial destructor。

stl空间配置器简介的更多相关文章

  1. STL空间配置器那点事

    STL简介 STL(Standard Template Library,标准模板库),从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其 ...

  2. stl空间配置器线程安全问题补充

    摘要 在上一篇博客<STL空间配置器那点事>简单介绍了空间配置器的基本实现 两级空间配置器处理,一级相关细节问题,同时简单描述了STL各组件之间的关系以及设计到的设计模式等. 在最后,又关 ...

  3. 【转】STL空间配置器

    STL空间配置器(allocator)在所有容器内部默默工作,负责空间的配置和回收.STL标准为空间配置器定义了标准接口(可见<STL源码剖析>P43).而具体实现细节则由各编译器实现版本 ...

  4. STL空间配置器

    1.什么是空间配置器? 空间配置器负责空间配置与管理.配置器是一个实现了动态空间配置.空间管理.空间释放的class template.以内存池方式实现小块内存管理分配.关于内存池概念可以点击:内存池 ...

  5. 咬碎STL空间配置器

    STL空间配置器 一.开场白: 给我的感觉就是,了解是空间配置器的功能,是那么的明了:在看原理,我还是很开心:接下来是360度大转变: 那么长的变量或者函数命名.那么多的宏.不爽,不过,遇上我这种二货 ...

  6. STL空间配置器解析和实现

    STL空间配置器的强大和借鉴作用不言而喻,查阅资料,发现了Dawn_sf已经对其有了极其深入和详细的描述,所以决定偷下懒借用其内容,只提供自己实现STL空间配置器的源码,具体解析内容参考:(一)STL ...

  7. 【陪你系列】5 千字长文+ 30 张图解 | 陪你手撕 STL 空间配置器源码

    大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub https://github.com/rongweihe/MoreT ...

  8. STL——空间配置器(构造和析构基本工具)

    以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...

  9. STL空间配置器、vector、list、deque、map复习

    本文写于2017-03-03,从老账号迁移到本账号,原文地址:https://www.cnblogs.com/huangweiyang/p/6440830.html STL的六大组件:容器.算法.迭代 ...

随机推荐

  1. 车牌识别算法库EasyPR的使用

    主要参考以下两个博客: http://blog.csdn.net/junmuzi/article/details/49888123 http://blog.csdn.net/Lucas66666/ar ...

  2. 判断二叉树B是否是树A的子树

    如下图所示,则认为树B是树A的子树. 代码如下: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode rig ...

  3. 处理Git不能上传大于100M文件问题

    记录一下自己工作遇到的问题,免得下次再遇到了还到处网上查资料解决. 自己的项目的版本控制用的是Git,代码仓库在github托管.项目里用到了百度导航SDK,由于百度导航SDK有了新版本,于是就更新到 ...

  4. Beta阶段——第五篇 Scrum 冲刺博客

    i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 对宿舍权限的管理 (2) 今天计划完成的工作: 完善权限管理,进行舍员充值分明 ...

  5. redis哨兵机制一(转)

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...

  6. [转帖漫画]什么是 MD5 算法?---摘要算法 具体算法 一直搞不清楚

    漫画:什么是 MD5 算法? 2017-10-05 20:16 来源:伯乐专栏作者/玻璃猫,微信公众号 - 梦见 好文投稿, 请点击 → 这里了解详情 梦见 摘要哈希生成的正确姿势是什么样呢?分三步: ...

  7. Java 使用 Dbutils 工具类库 操作mysql

    Dbutils 官网http://commons.apache.org/proper/commons-dbutils/ 结合我个人写的JDBCUtils 写的 Dbutils 的使用demo . JD ...

  8. google 浏览器插件安装

    谷歌访问助手

  9. Mxnet Windows配置

    MXNET Windows 编译安装(Python) 本文只记录Mxnet在windows下的编译安装,更多环境配置请移步官方文档:http://mxnet.readthedocs.io/en/lat ...

  10. BZOJ3504 CQOI2014危桥(最大流)

    如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...