zoukankan      html  css  js  c++  java
  • 读书笔记_Effective_C++_条款四十八:了解模板元编程

    作为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子:

     1 template <int N>
     2 struct Factorial
     3 {
     4     enum
     5     {
     6         value = N * Factorial<N - 1>::value
     7     };
     8 };
     9 
    10 // 特化版本
    11 template <>
    12 struct Factorial<0>
    13 {
    14     enum
    15     {
    16         value = 1
    17     };
    18 };
    19 
    20 int main()
    21 {
    22     cout << Factorial<5>::value << endl; // 输出120
    23 }

    在编译期,Factorial<5>::value就被翻译成了5 * 4 * 3 * 2 * 1,在运行期直接执行乘法即可。

    元编程有何优点?

    1. 以编译耗时为代价换来卓越的运行期性能,因为对于产品级的程序而言,运行的时长远大于编译时长。

    2. 将原来运行期才能发现的错误提前到了编译期,要知道,错误发现的越早,代价越小。

    元编程有何缺点?

    1. 代码可读性差,写起来要运用递归的思维,非常困难。

    2. 调试困难,元程序执行于编译期,不能debug,只能观察编译器输出的error来定位错误。

    3. 编译时间长,运行期的代价转嫁到编译期。

    4. 可移植性较差,老的编译器几乎不支持模板或者支持极为有限。

    模板元编程TMP虽然有这么多的缺点,但它已经被证明是“图灵完全”的了,意思是它的威力大到足以计算任何事物。目前boost库中用到了一些TMP技术,但大部分项目还是因为TMP的一些缺点而没有广泛采用,所以这里我们只要略做了解即可。

    下面总结一下:

    1. TMP可将工作由运行期转移到编译期,因而得以实现早期错误侦测或者更高的执行效率。

    2. TMP可被用来生成“基于政策选择组合”的客户定制代码,也可以用来避免生成对某些特殊类型并不适合的代码。(这句话看不懂也没关系)

  • 相关阅读:
    实验五——循环结构学习总结
    实验七——函数定义及调用总结
    实验九——基本数据类型存储及应用总结
    实验六——循环结构程序练习总结
    第二次作业及总结——数据类型和运算符
    实验八——函数定义及调用总结
    实验四——多分支结构及本章总结
    开篇随笔
    第三次作业——for 语句及分支结构elseif
    第二次作业
  • 原文地址:https://www.cnblogs.com/jerry19880126/p/3672158.html
Copyright © 2011-2022 走看看