最新消息:想得多,做的少。一天到晚瞎鸡巴搞。

STL自问自答之空间配置

大概数据结构与算法 阿虚 32浏览 0评论

STL提供了几种空间管理

.      STL提供了两种空间管理,一种是简单的默认内存管理,在defalloc.h中。就是简单的包装一下new和delete来进行内存申请和释放。并没有考虑任何效率上的强化。第二种是STL自己的内存配置器,stl规定配置器定义在memor头文件中。具体实现在stl_alloc.h头文件中。内置的内存配置器有分为两种,一级配之器和二级配置器。

.      Memory头文件中标注介绍了三个自子头文件,stl_construct.h、stl_alloc.h以及stl_uninitialized.h。

stl_construct.h

.      这个头文件介绍了全局类构造和析构函数。代码篇幅不长但是在析构函数中介绍了一招利用模板、模板特化、typedef类型重定义以及函数重载四种C++机制组合使用来对类进行类型识别的技术。对基础类型释放进行加速处理。虽说此节内容详细放在了第三章讲解,但是翻阅代码仔细琢磨还是粗浅了解其中的实现机理。理解之后第一次明了熟悉C++的大牛和普通程序员的差距而产生的膜拜心态。

.      这部分对于不太明白的地方还是有的,主要在于value_type()到底有什么作用。关注代码片段的上下文并没有太理解value_type()函数的用处。但是作者又重载了那么多。这里仅做记录一下问题,这里我就暂时不在深究等自问自答迭代器时在思考。

stl_alloc.h

.      开始就介绍了STL的内存配置器的设计哲学:考虑多线程状态、考虑内存不足时的应变措施和考虑过多“小型区块”可能造成的内存碎片问题。

.      头文件存在四个类:debug_alloc、simple_alloc、__malloc_alloc_template以及__default_alloc_template。3.为一级配置器,4.为二级配置器.2.为包装一级和二级配置器的接口。1.为调试类

.      SGI存在两种配置器,一级配置器和二级配置器。具体采用哪种配置器由宏__USE_MALLOC来决定。SGI默认使用第二级配置器。

.      因为SGI存在两种配置器,所以定义了一个简单的接口类simple_alloc。simple_alloc是一个模板类,提供4个静态变量给他人使用。调用哪种配置器由模板Alloc来决定。因为不管是一级还是二级都导出了对应的静态接口来供他人使用。

一级配置器

.      一级配置器默认的内存管理类似使用malloc来申请内存,如果malloc内存不足时调用oom_malloc()函数来做内存申请。oom_malloc()不停调用malloc()来索要内存。当然,前提是你得设置内存不足时的回调例程。如果没有这个回调例程内存不足时就直接给你结束掉进程了。

.      PS:new-handler参考《Effective C++》

二级配置器

.      二级配置器内部存在一个“内存池”,内存池负责管理每次申请小于128字节的内存、具体为每次二级配置器如果申请的内存超过128字节那么就由一级配置器来进行空间分配并返回给程序使用,如果申请内存不超过128字节就将申请的内存上调至8的倍数(申请30字节就调整申请32字节)然后搜索对于8的字节倍数的内存是否存在可用空间,有拿出来使用。没有内存申请。并且加入内存池管理。这部分书中有很详细的源码分析,多啰嗦无意。

stl_uninitialized.h

.      利用模板和特化泛化对拷贝进行提速。对应高层次就是copy,copy_n,fill,fill_n。不过这些函数有个特点就是必须保证所有的内容全部都被正确创建成功,也就是说有一个内容拷贝或者创建失败了那么就会将所有拷贝成功的一并析构掉。简单说要么全部成功,一个失败否决一切。类似于你不考100分就相当于没及格要挨打的那种家长。。emmmmm这么说会不会戳到一些人的痛处当中….. 滑稽.jpg

STL空间配置多线程和单线程的区别是什么

.      多线程处理比单线程处理就是多定义两个变量,__node_allocator_lock_initialized用于二级配置器在构造的时候提供一个全局静态初始化标记和一个静态临界区变量__node_allocator_lock用于管控线程安全的临界区。然后多定义了一个内部的lock类,这个类只有一个构造,一个析构。构造的时候调用EnterCriticalSection(),析构的时候调用LeaveCriticalSection()。调用处在allocate申请内存小于128时候使用到了。 然后还有管理8的倍数的free_list以及一些内存操作指针也加上了volatile关键字。自己整理了源码发现侯先生没有讲解的多线程并没有什么特别复杂高深的操作。

转载请注明:虚无 » STL自问自答之空间配置

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址