2 空间配置器

来源:互联网 发布:淘宝u站报名入口 编辑:程序博客网 时间:2024/05/18 08:13

2 空间配置器

2.2 具备次配置力的SGI空间配置器

SGI STL缺省使用alloc为配置器,而不是采用标准写法allocator<int>,前者效率更高。

1、构造和析构基本工具:constuct()和destroy()——<stl_construct.h>(内部包含头文件<new>,用于placement new)

constuct()接受一个指针p和一个初值value,将初值设定到指针所指的空间上。

template <class T1, class T2>inline void construct(T1* p, const T2& value) {new (p) T1(value);// placement new; 喚起T1::T1(value);}


 

destroy()有两个版本,第一个版本接受一个指针;第二个版本接受first和last两个迭代器,它首先利用value_type()获得迭代器所指对象的型别,再利用__type_traits<T>判断该型别的析构函数是否无关痛痒,若是(__true_type),则什么也不做,若不是(__false_type),才以循环方式就每一个对象调用第一个版本的destroy ()。

 

2、空间的配置与释放,std::alloc——<stl_alloc.h>

设计哲学:向system heap要求空间,考虑多线程状态,考虑内存不足时的应变措施,考虑过多“小型区块”可能造成内存碎片(使用双层级配置器)。

# ifdef __USE_MALLOCtypedef __malloc_alloc_template<0> malloc_alloc;typedef malloc_alloc alloc; // 令alloc 為第㆒級配置器# else// 令alloc 為第㆓級配置器typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc;#endif /* ! __USE_MALLOC */


5、第一级配置器__malloc_alloc_template剖析

 SGI以malloc而非::operator new来配置内存,因此SGI不能直接使用C++的set_new_handler(),必须使用一个类似功能的set_malloc_handler()。

 

 6、第二级配置器__default_alloc_template剖析

//free-list的节点结构如下:union obj{union obj* free_list_link;char client_data[1]; //The client sees this.}//16个free-list,各自管理大小为8、16、24、...、128 bytes的小额区块。static obj* volatile free_list[16];


 7、配置器类__default_alloc_template中的成员函数allocate():判断块大小,大于128字节则调用第一级配置器;小于128字节则检查对应的free-list,如果没有可用区块,则调用成员函数refill()为free-list填充空间。refill()调用chunk_alloc()从内存池中取得空间,之后链入对应的free-list。chunk_alloc()负责从内存池中取得空间,并在内存不足时,补充内存池。(补充内存池即调用malloc()分配一大段内存,如果malloc失败(不会抛出异常,返回NULL),则调用第一级配置器的成员函数allocate()(注意该函数有malloc_handler,并在内存仍然不足时可能抛出异常)。)

 

8、配置器类__default_alloc_template中的成员函数deallocate():空间释放函数。

 

2.3 内存基本处理工具

如果要使用本节的三个低层次函数,应该包含<memory>,不过SGI吧它们实际定义于<stl_uninitialized>中。

1、uninitiated_copy

template <class InputIterator, class ForwardIterator>ForwordIteratorininitialized_copy(InputIterator first, InputIterator last, ForwordIterator result);


注意:其中使用了value_type()、__type_traits、__true_type、__false_type、is_POD_type等实现技术。

2、uninitialized_fill(first, last, const T& x)

3、uninitialized_fill_n(first, Size n, const T& x)

原创粉丝点击