stl空间配置器简介

  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空间配置器alloc
    SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器视情况采用不同的策略:当配置区块超过128bytes时,调用第一级配置器,当配置区块小于128bytes时,采用内存池方式 == ==> malloc_alloc; - 使用16个链表来维护大小不同的空闲 ...
  • STL库的内存配置器allocator
    正在学习中,如果有错,还请多多指教,根据不断的理解,会进行更改,更改之前的样子都会保留下来,记录错误是最大的进步,嗯嗯! 具有次配置力的SGI空间配置器(SGI是STL的一种版本,也有其他的版本) 这里我就不贴出来具体成员和接口的实现了,网上可以搜到STL的源码 C++中,new一个变量可以分为两个 ...
  • 我们学了 Android 数据持久化的技术,包括文件存储.SharedPreferences 存 储.以及数据库存储.不知道你有没有发现,使用这些持久化技术所保存的数据都只能在当 前应用程序中访问.虽然文件和 SharedPreferences 存储中提供了 MODE_WORLD_READABLE ...
  • 网络学习十七虚拟机相关配置参数简介
    虚拟机相关配置参数简介     1.创建好的虚拟机配置,如虚拟机的内存大小.硬盘数量.网卡数量和连接方式.声卡.USB接口等并不是一成不变的,用户可以根据需要随时修改(主要内容引用王春海老师的著作).     下面开始介绍:     一般我们应该在虚拟机关机的情况下,修改虚拟机的配置:在VMware ...
  • 7.7外围应用配置器
    7.7 外围应用配置器在新安装的 SQL Server 的默认配置中,许多功能并未启用.SQL Server 只是有选择地安装和启动关键服务和功能,以最大限度地减少可能受到恶意用户攻击的功能数.系统管理员可以在安装时更改这些默认选项,也可以有选择地启用或禁用正运行的 SQL Server 实例的功能 ...
  • 信息化目前已经深入到企业经营活动的各个环节,越来越多的企业都采用信息化系统来对企业进行管理.特别是对于一些信息化程度高的企业,在企业内部一般都有多套系统在进行运行.但是目前碰到的困惑就是这些信息化系统不能及时的适应企业发展的变化,系统需要专人进行维护,升级换代时不能继承原先的工作成果.特别是在系统升 ...
  • Code maturity level options代码成熟度选项Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择 General setup常规设置Local ...
  • 1介绍2Advantages3安装3.1在 LVM 上安装 Arch Linux3.2创建 LVM 分区3.3创建物理卷(PV)3.4创建卷组(VG)3.5创建逻辑卷(LV)3.6建立文件系统与挂载逻辑卷3.7重要3.7.1设置文件系统挂载点3.7.2配置系统4配置4.1扩大逻辑卷4.2缩小逻辑卷4 ...
一周排行
  •    由去年9月份办理的签证一直到今年9月份过期了,一年再次竟然都找不到合适的时机过去.现在终于有机会过去了,却不得不从茂名连夜坐车远 赴深圳罗湖口岸,一路奔波,只能跟香港有初步的接触了.    香港初步印象给我的感 ...
  • GRE_VPN配置(建议选择Cisco2811路由器)
    技术原理:GRE (Generic Routing Encapsulation): 是对某 ...
  • 用好Windows8中的壁纸新特性
    Windows 7 中的"壁纸自动换"功能让我们的桌面不再是单板枯燥的 ...
  •  监控日志命令:tail -f  /   tailf 查看磁盘空间:df,du 分析系统性能或硬件资源负载:cptime,top,System Monitor 分析内存:free,swapon -s,vmstat 分 ...
  • 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考
    事情是如何发生的 最近干了件事情,发现了 underscore 源码的一个 bug.这件事 ...
  • 年前有朋友说要招实习生了,有内推,然后自己投了一发简历,测试开发(问我为什么不投开发,因为被xx拒绝了三次没有信心啊).然后发现特码的自己连测试的面试都被虐啊喂. 上来先做了一套笔试题,1个小时的时间,四个选择,6个 ...
  • [[email protected] ~]# vim account.sh#!/bin/bash## Founded account## History:# 2012/07/06    JinYan   PATH=/sb ...
  • 由于各种各样的需要,我先后获得了Windows Server 2008,Windows Server 2008 R2,Windows 7 Ultimate(旗舰版),Windows 7 Enterprise(企业版) ...
  • Oracle的listener.ora、tnsnames.ora的配置
    使用DBCA建库,Global Database Name为:prod.origtec.c ...
  • 解决新建Support7Demos的sample时出现编译错误和运行报错出现的问题