• Effective C++ 读书笔记(46-50)


      条款四十六:需要类型转换时请为模板定义非成员函数

      条款四十七:请使用traits classes 表现类型信息

        1.整合重载技术后,traits classes 有可能在编译期对类型执行if...else测试。

        2.STL共有五种迭代器分类

                 1)Input迭代器只能向前移动一次一步,客户只可读取(不能涂写)它们所指的东西,而且只能读取一次。(模仿指向输入文件的阅读指针)

                 2)Output迭代器一切只为输出,它们只向前移动,一次一步,客户只可涂写它们所指的东西,而且只能涂写一次。

                   3)forward迭代器,可以做Input和Output所能做的每一件事,而且可以读或写其所指物一次以上。

                 4)Bidirectional迭代器比forward更强大,除了可以向前移动还可以向后移动。set.multiset,map,multimap的迭代器都属于这种。

                 5)random access迭代器,可以执行迭代器算术。也就是可以在常量的时间内向前或向后跳跃任意距离。(类似于指针算术)vector,deque和string提供的迭代器都是这一分类。

        3.迭代器类型的继承关系图如下:

                                                              

      条款四十八:认识template元编程

        1.Template metaprogramming(TMP,模板元编程)是编写template-based C++程序并执行于编译期的过程。

        2.TMP有两个伟大的效力:第一,它让某些事情更容易。第二,由于Template metaprograms执行于C++编译期,因此可将工作从运行期转移到编译期。

        3.TMP已被证明是个“图灵完全”机器。意思好似他的威力大到足以计算任何事物。使用TMP你可以声明变量、执行循环、编写及调用函数。。。但这般构件相对于“正常的”c++对应物看起来很是不同。

        4.TMP的起手程序是在编译期计算阶乘。示范如何通过“递归模板具现化”实现循环,以及如何在TMP中创建和使用变量:

    template<unsigned n>
    struct Factorial
    {
       enum {value=n*Factorial<n-1>::value};
    };
    
    template<>
    struct Factorial
    {
     enum{value=1};
    };
    
    int main()
    {
     std::cout<<Factorial<5>::value;//印出120
     std::cout<<Factorial<10>::value;//印出3628800
    }

        5.使用TMP的优势:

              1)确保度量单位正确。

              2)优化矩阵运算。

              3)可以生成客户定制之设计模式。

        6.Template mataprogramming可将工作由运行期移往编译期,因而得以实现早期错误侦测的执行效率。

      条款四十九:了解new-handler的行为

        1.设计良好的new-handle函数必须做以下事情:

                        1)让更多内存可被使用。

                        2)安装另一个new-handle。

                        3)卸除new-handle。

                        4)抛出bad-alloc(或派生自bad_alloc)的异常。

                        5)不返回,通常调用abort或exit。

        2.set_new_handle允许客户指定一个函数,在内存分配无法获得满足时被调用。

      条款五十:了解new和delete的合理替换时机

        1.主要了解何时可在“全局性的”或“class专属的”基础上合理替换缺省的new和delete。

                              1)为了检测运行错误。

                              2)为了收集动态分配内存之使用统计信息。

                              3)为了增加分配和归还的速度。

                              4)为了降低缺省内存管理器带来的空间额外开销。

                              5)为了弥补缺省分配器中的非最佳齐位。

                              6)为了将相关对象成簇集中。

                              7)为了获得非传统的行为。

        2.有许多理由需要写个自定义的new和delete,包括改善效能、对heap运用错误进行调试、收集heap使用信息。

  • 相关阅读:
    让x86的android模拟器能模拟arm架构系统
    婴儿补充微量元素
    asterisk 能打电话的配置
    SIP协议错误代码大全
    asterisk错误排查
    asterisk帮助与国内论坛
    win10 只要打开文件对话框就卡死解决方法
    分享到朋友圈实现
    跳转前暂停几秒js如何实现
    Github css加载失败,样式混乱解决办法
  • 原文地址:https://www.cnblogs.com/xxiaoye/p/3584263.html
Copyright © 2020-2023  润新知