SGI-STL简记(五)-工具、杂项解析

utility:
stl_relops.h :
    内部提供了重载模板operator!=、operator>、operator<=、operator>=,而这几个模板函数内部使用到了operator==以及operator<;故只需要模板参数T支持operator==以及operator<,
    便可支持其他的比较操作,而不用都重载一次;

stl_pair.h :
    pair struct模板类,仅仅提供两个构造函数,一个默认构造函数,另一个是通过参数依次初始化成员变量first、second;但也暗含了模板参数类型T需隐式或显式支持赋值构造函数;
    此外重载了多种比较运算符、以及一个工具函数make_pair以构造pair对;

stl_tempbuf.h :
    临时缓冲区模板类、函数;
    get_temporary_buffer:获取临时缓冲区,内部调用__get_temporary_buffer实现;参数ptrdiff_t len, T*,此处T*只是作为一个类型标识,可不必要;返回类型为pair<T*, ptrdiff_t>其中T*为
    申请到的空间地址,第二个参数为实际分配到的空间大小;最大可申请大小为INT_MAX / sizeof(T);申请策略为:先调整申请大小并申请需求大小空间(内部通过malloc申请),若失败则
    重新减半申请,依次类推直到申请成功或失败为止;

    return_temporary_buffer:释放之前申请返回的内存空间(调用free直接释放)(即pair对第一个成员);

    _Temporary_buffer:临时缓冲区模板类,模板参数为<class _ForwardIterator, class T>,即提供至少为前向迭代器以及数据类型,数据成员_M_original_len为原始长度,_M_len为申请到的缓冲区长度,
    _M_buffer为申请到的缓冲区首地址;
    构造函数参数为迭代器范围,内部调用distance获取迭代器范围长度以初始化_M_len,此后调用_M_allocate_buffer执行实际的缓冲区申请操作,调用_M_initialize_buffer初始化该缓冲区;
    若申请或初始化过程出现异常,则释放申请成功的缓冲区;
    _M_allocate_buffer:与__get_temporary_buffer实现机制相同,_M_original_len保存原始迭代器范围长度;
    _M_initialize_buffer:重载版本的初始化缓冲区,根据迭代器类型是否需要__true_type内置POD类型或有隐式默认构造函数,若不是则需要用第一个迭代器值并调用uninitialized_fill_n进行初始化;
    析构函数内部调用destroy销毁各个申请缓冲区中的每个对象,而后调用free释放该缓冲区;
    size:获取申请到的缓冲区大小;
    requested_size:获取请求的缓冲区大小;
    begin、end:获取缓冲区首地址和缓冲区尾部地址(类似于新的迭代器范围);

    _Temporary_buffer与get_temporary_buffer不同之处在于,前者封装了后者功能且提供更多的操作接口,此外前者通过迭代器范围来申请缓冲区大小以及通过迭代器第一个值初始化该缓冲区;

    temporary_buffer:只是简单地继承于_Temporary_buffer,未增加其他操作,一般是给外部直接使用的类;

原文地址:https://www.cnblogs.com/haomiao/p/11647219.html

时间: 2024-10-04 21:08:41

SGI-STL简记(五)-工具、杂项解析的相关文章

SGI STL内存管理

在SGI STL版本的内存管理中,使用这样一种方式来分配内存:内存分配+对象初始化.首先是分配内存,其次是根据对象的类型(是否为POD[Plain of Data])来使用最有效的方式来初始化对象.回收内存也是用同样的方式:析构对象+回收内存,根据对象是否为POD类型,确定最有效的析构方式. SGI STL使用双层级配置器,第一级配置器直接使用malloc()和free(),第二级根据如下策略:当配置区块>128 Bytes时,视之为"足够大",调用一级配置器,否则视之为过小,调

SGI STL内存配置器(一):内存泄漏?

阅读了Alexander大神的SGI STL源码,膜拜,很高质量的源码,获益匪浅.温故而知新!下文中所有STL如无特殊说明均指SGI版本实现. STL 内存配置器 STL对内存管理最核心部分我觉得是它将C++对象创建过程分解为构造.析构和内存分配.释放!摆脱了由于频繁调用new或malloc函数向操作系统申请空间而造成的低效.其中析构操作时对具有non-trival.trival 析构函数的class区别对待也提高了效率.至于SGI的两级配置器结构则属于锦上添花的类型. STL两级结构的内存配置

迅速读懂:Effective STL (五)

这是<Effective STL>笔记最后一期,不能涵盖全部内容,书后仍然有些附加内容,不在附加,有兴趣可以找原书来读读,一则是区域设置后的忽略大小写比较,另一则是MSVC4-5编译器下STL注意事项 条款41:了解使用ptr_fun.mem_fun和mem_fun_ref的原因 函数和函数对象总使用用于非成员函数的语法形式调用.mem_fun带有一个到成员函数的指针,pmf,并返回一个mem_fun_t类型的对象.这是一个仿函数类,容纳成员函数指针并提供一个operator(),它调用指向在

SGI STL的 power 函数之个人理解

SGI STL的power函数用于计算某数的n次方 例如求 x的n次幂 n = 20 (20 二进制 10100) 1 0 1 0 0 20 = 2^4 + 2^2 x^20 = x^((2^4) + (2^2)) = x^( 2^4 ) * x ^( 2^2) part2 part1 template <class _Tp, class _Integer, class _MonoidOperation> _Tp __power(_Tp __x, _Integer __n, _MonoidOp

基于oracle SQL Developer Data Modeler建模工具,解析xml,生成etljet代码

今天准备在 @zhangkai05 写的小工具model_sql基础上,进一步完善功能,使其更加自动化.方便建模人员开发etl任务. 源代码更改后 ,会发布到 git(url地址)上,逐步完善. 描述现状及问题 团队 数据仓库建模在2013年下开始使用 oracle sql developser datamodeler建模工具,之前一直用 powerdesigner,但由于后者是商业收费软件,公司又不打算购买.故经过调研,转向oracle建模工具.虽然其 易用性与 power designer

2.SGI STL第二级空间配置器__default_alloc_template的chunk_alloc函数

SGISTL默认使用二级空间配置器,当需要配置的区块大于128 bytes时SGI STL调用一级空间配置器,一级空间配置器的allocate函数直接使用malloc分配内存,deallocate函数直接使用free释放内存.当需要配置的区块小于128 bytes时SGI STL调用二级空间配置器. 相比于一级空间配置器简单粗暴的内存使用方法,二级空间配置器对内存的使用显得精细很多. 二级空间配置器的具体用法请看书,我就不抄书了,只对二级空间配置器中容易糊涂的地方写一下我的理解. 内存池和fre

stl+模拟 CCF2016 4 路径解析

1 // stl+模拟 CCF2016 4 路径解析 2 // 一开始题意理解错了.... 3 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 void fre() {freopen("in.txt","r",stdin);} 9 vector<string> l; 10 int main(){

Java学习之Xml系列五:SAX解析——搜索xml内容

本文对SAX解析进一步说明. 另外主要给利用SAX解析方法找到指定条件(如标签名称)的xml文档内容. 首先按需要介绍一下DefaultHandler. DefaultHandler类是SAX2事件处理程序的默认基类.它继承了EntityResolver.DTDHandler.ContentHandler和ErrorHandler这四个接口.包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法.(注意:ContentHandler

SGI STL functors(仿函数) 12

函数对象,即"行为类似函数"的对象,重载function call运算子(operator ()).STL仿函数根据操作数个数划分,可分为一元和二元仿函数,按功能划分可分为算数运算.关系运算.逻辑运算三大类.使用内建仿函数需包含<functional>头文件. 仿函数可配接的关键 为了拥有配接能力,需要依照规定定义自己的5个相应型别.仿函数的相应型别主要用来表现函数参数型别和传回值型别.为了方便期间,<stl_function.h>定义了两个class,分别表示