• SGI-STL简记(三)-构造、类型萃取特性、未初始化解析


    stl_construct.h :
        提供多种构造器、销毁器模板函数;
        构造器construct提供了给定值构造和默认构造方式,通过调用重载函数_Construct实现;
        销毁器destroy提供了销毁指针和迭代器的方式,通过调用重载函数_Destroy实现;
        _Construct:通过“放置”new,构造实现;
        _Destroy:通过调用模板类型对象析构函数实现,对于迭代器器方式,则通过__destroy(内部通过__destroy_aux)遍历销毁,因内置数据类型不需要销毁,
        故内部需要判断是否为内置类型,对非内置类型则调用对应类型的析构函数即可,否则不处理;
        __destroy_aux:重载的模板类,通过__false_type或__true_type确定是否为可隐式销毁的对象;
        此外_Destroy因普通内置类型的指针也可作为迭代器,故又重载了各个基本类型的处理(不处理);
    
    type_traits.h :
        类型萃取、特性;
        两个特殊类型__true_type、__false_type,一般作为某些模板参数的识别的标识,如上面的__destroy_aux;
        __type_traits:类型特性萃取模板类,其中has_trivial_default_constructor、has_trivial_copy_constructor、has_trivial_assignment_operator、
        has_trivial_destructor、is_POD_type分别表示为隐式默认构造、拷贝构造、赋值操作、隐式析构、是否为原内置类型,默认情况下均为__false_type;
        其他的__type_traits特化版本均为内置类型(如:int,bool,float,...,char *等)均为__true_type,
        _Is_integer:模板函数,是否为整型(或可转化为整型的类型(如:int, unsigned char, short, long long ...)),其中_Integral在其他情况默认为__false_type;
        当为整型类型时,为__true_type;
        
        此外还有各个组件中基本上都会用到的类型重声明:
            typedef size_t     size_type;
            typedef ptrdiff_t  difference_type;
            typedef _Tp*       pointer;
            typedef const _Tp* const_pointer;
            typedef _Tp&       reference;
            typedef const _Tp& const_reference;
            typedef _Tp        value_type;
            
    stl_uninitialized.h :
        初始化填充、拷贝:
        uninitialized_copy:目前提供3个重载版本,其中两个分别对char*、wchar_t*数据类型直接调用memmove内存拷贝,另一个提供迭代器范围拷贝,其通过
        __uninitialized_copy处理,内部获取结果前向迭代器的内容指针类型并再次调用__uninitialized_copy_aux;__uninitialized_copy_aux内部通过萃取
        内容指针类型是否为is_POD_type,实现分别处理不同的内容,若为原始POD则内部直接调用copy即可,否则遍历迭代器并分别调用_Construct构造,若失败
        抛出了异常则调用_Destroy析构之前已成功构造的对象,此外根据迭代器不同,有不同的迭代策略;
        uninitialized_copy_n:同uninitialized_copy,提供了拷贝个数的参数;
        uninitialized_fill、uninitialized_fill_n:类型于uninitialized_copy与uninitialized_copy_n;原始POD类型通过fill填充,否则遍历迭代调用_Construct构造,
        若失败抛出了异常则调用_Destroy析构之前已成功构造的对象,此外根据迭代器不同,有不同的迭代策略;
        
  • 相关阅读:
    Ambiguous mapping. Cannot map 'labelInfoController' method
    在写ssh项目时浏览器页面出现http status 404 – not found
    JS页面出现Uncaught SyntaxError: Unexpected token < 错误
    Data truncation: Truncated incorrect DOUBLE value:
    个人最终总结
    结对编程--黄金点游戏
    Windows操作系统----锁住命令行窗口
    Windows操作系统下给文件夹右键命令菜单添加启动命令行的选项
    命令行下运行 java someClass.class出现 “错误:找不到或无法加载主类someClass ” 的解决方案
    Qt Quick程序的发布
  • 原文地址:https://www.cnblogs.com/haomiao/p/11647208.html
Copyright © 2020-2023  润新知