欢迎大家来访二笙的小房子,一同学习分享生活!
文章目录
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>中,实现精密分工:
#include <stl_construct.h>
,定义了全局函数construct()和destory(),负责对象的构造和析构#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 空间的配置与释放
2.5 内存基本处理工具
- 理解下图所列的,我觉得大概就差不多了(忽略图画的不好看orz)