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使用信息。

原文地址:https://www.cnblogs.com/xxiaoye/p/3584263.html