STL源码剖析(二)空间配置器

欢迎大家来访二笙的小房子,一同学习分享生活!

1. 写在前面

首先需要理解为什么将空间配置器这一组件放在第二章进行讲解?因为STL中的操作对象都存放在容器中,而容器需要空间配置器来配置空间,因此空间配置器作为STL中最重要的一个组件,理解了空间配置器对于后续容器的理解也会有很大的帮助。

2. SGI空间配置器

  • STL空间配置器标准接口一般由allocator类加上一些函数组成,而SGI STL的配置器更为与众不同,其名称使用alloc

2.1 SGI标准空间配置器

  • SGI定义了一个符合部分标准、名为allocator的配置器,但不建议使用,主要原因是效率不佳
  • 只把::operator new 和::operator delete简单进行了包装,部分代码如下:
//简单封装::operator new
template <typename T>
inline T* allocator(ptrdiff_t size, T*) {
	set_new_handler(0);   //关于该函数,具体可以在《effective C++》中条款49得以了解
	T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));
	if (tmp == 0) {
		cerr << "out of memory" << endl;
		exit(1);
	}
	return tmp;
}
//简单封装::operator delete
template <class T>
inline void deallocate(T* buffer) {
	::operator delete(buffer);
}

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

一般C++内存配置操作和释放操作:

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

new包含两步操作:1.调用::operator new配置内存 2.调用构造函数构造对象内容
delete包含两步操作:1.调用析构函数将对象析构 2.调用::operator delete释放内存

  • STL将配置器定义于< memory>中,实现精密分工:
  1. #include <stl_construct.h>,定义了全局函数construct()和destory(),负责对象的构造和析构
  2. #include <stl_alloc.h>,定义了一二级配置器,负责内存空间的配置和释放
  • #include <stl_uninitialized.h>,定义了全局函数,用来填充或复制大块内存数据,该头文件定义于memory,虽不属于配置器,但与对像初值有关

2.3 构造和析构基本工具

定义在#include <stl_construct.h>中的construct()和destroy()

  • 对象构造:
template <class T1, class T2>
inline void construct(T1* p , const T2* value) {
  new (p) T1(value);    //调用T1::T1(value)
}
  • 对象析构:
//第一版本,接受一个指针
template <class T>
inline void destroy(T* pointer) {
    pointer->~T();   //调用析构
}
//第二版本,接受两个迭代器,找出元素的数值型别,利用_type_traits<>选择不同方式处理
template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardItertor last) {
   __destroy(first, last, value_type(first);  //调用该函数进行判断
}
//如果判断数值没有那些影响效率的析构函数,则循环遍历该范围,并每经历一个对象就调用第一个版本的destroy
template <class ForwardIterator>
inline void 
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {
     for (; first < last; ++first)
          destroy(&*first);   //对每一个对象调用一版本的destroy
}
//如果存在影响效率的析构函数,则什么也不做
template <class ForwardIterator>
inline void 
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {}

2.4 空间的配置与释放

SGI STL空间配置与释放解析

2.5 内存基本处理工具

  • 理解下图所列的,我觉得大概就差不多了(忽略图画的不好看orz)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值