解析学习C++时的疑难问题

开发 后端
C++作为一种语言,大多数的人都是把它默认为面向对象的支持,认为他就是C语言的替代品,一种延伸而已,而事际上,C++与C是完全不同的语言。

许多编程人员学习C++总结经验为,有的觉得C++语言是一门独立的语言,并不是在C语言的基础上,可以直接学习C++不必先从C下手,这就像C++与Java一样,局部的结构还是不一样的。

C++作为一种通用的程序设计语言已相当成功的实现了她最初的设计目标:高效率,通用性,可扩展性与灵活性;是一种语言而不是一个系统;她给予程序员尊重而不是束缚等等。

其实,学习C++时,它还支持一种被称为模板元编程的泛型程序设计范型,其核心就是巧妙利用C++的模板机制与面向对象的机制将程序对数据的处理提前到编译期,而不是运行时。这种程序设计方式如同函数式的编程方式。在这种设计范型中没有变量与循环,但其图灵完备所以称其为元编程。

接下来我将举一个简单的例子看看这种程序设计对运行时效率的影响。有这么一组数列1,1,2,3,5,8,13,21,等等,最前一,二项是1,以后每一项是其前两项的和。现在我们编程计算第N项的数值。程序如下:

  1. //CODE  
  2. #include "stdafx.h"  
  3. //编译期计算方法  
  4. template <int n>  //主模板 计算数列第N项  
  5. struct f  
  6. {  
  7.  enum {value=f<n-1>::value+f<n-2>::value};  
  8. };  
  9. template<> 
  10. struct f<1>  //特化模板  数列***项是1  
  11. {  
  12.  enum {value=1};  
  13. };  
  14. template<> 
  15. struct f<2>  //特化模板  数列第二项是1  
  16. {  
  17.  enum {value=1};  
  18. };  
  19. //远行时计算方法  
  20. long F (long n)  
  21. {  
  22.  if (n==1 || n==2)  //数列***,二项是1直接返回  
  23.  {  
  24.   return 1;  
  25.  }  
  26.  else      //递归  
  27.  {  
  28.   return F(n-1)+F(n-2);  
  29.  }  
  30. }  
  31. int _tmain(int argc, _TCHAR* argv[])  
  32. {  
  33.  std::cout<<f<45>::value<<std::endl; //计算第45项的数值  
  34.  std::cout<<F(45)<<std::endl;  
  35.  return 0;  

特化模板就如同我们循环的终止条件,在模板的递归实例化过程中充当递归终止条件。当主模板的N降为1或2时,模板递归实例化停止,开始计算value的数值。有人会问:为什么当N等于1或2时,编译器会根据特化模板实例化呢?

还记得C++对函数的调用规则吗?学习C++在调用重载函数过程中,编译器会寻求最匹配的一个。其实,在C++中,当编译器发现有众多被选项时,它会选择***条件,最匹配的那个。这不是很合理吗?

我想接下来的代码就是你我非常熟悉不过的了,一个递归函数,测试代码,程序结果:

  1. template<> 
  2.  struct f<1>  //特化模板  数列***项是1  
  3.  {  
  4.   enum {value=1};  
  5.  };  
  6.  template<> 
  7.  struct f<2>  //特化模板  数列第二项是1  
  8. {  
  9.   enum {value=1};  
  10.  }; 

有人会问:问号是什么意思?其实是“不知道”的意思。***行不到1秒(其实更短)就输出了,而和它一模一样运行时的结果却让我等得花儿都谢了。为什么会这样呢?编译期学习C++运行时计算秘密在于?:***行的结果在程序运行时结果已经早就被算出来了,程序只要简单的输出即可;

而它的同胞兄弟还在运行时堆栈里漫游了。模板实例化发生在程序构造阶段——编译期,所以有关的计算都发生在编译期,即编译期计算。而普通的递归函数运行于程序的运行期,其执行要牵涉大量的堆栈操作,有关计算必须在运行时计算。由以上的直观体验我们可以看到编译期计算对程序运行时的效率提高的影响是巨大的。

  1. C与C++中标准输入实现方式上的一点区别
  2. C++编译器如何对Const常量进行分配存储空间
  3. C++类库设计的基本构思与方法
  4. 玩转C++语言的几种方法
  5. 如何更好的进行C++代码编制
责任编辑:chenqingxiang 来源: NET130
相关推荐

2011-04-01 14:05:09

SQL数据库

2017-04-18 22:50:10

OSPF疑难问题

2012-05-04 09:18:46

2011-05-06 14:05:22

打印机照片打印

2009-11-02 15:03:21

VSFTP服务

2009-12-25 10:59:08

WPF Timer

2009-12-23 08:53:56

Windows 7远程协助

2011-08-03 13:25:19

布线系统规划

2011-04-26 16:39:30

照片打印机

2010-08-20 11:22:48

DB2性能调优

2010-03-09 12:23:30

Python编码

2010-01-26 16:54:58

学习C++

2009-12-24 18:03:35

WPF线程渲染

2010-01-11 16:19:05

C++ Builder

2010-08-13 14:40:14

DB2性能调优

2009-06-18 08:46:56

微软Windows 7操作系统

2010-07-05 14:41:21

SQL Server数

2023-05-29 18:33:30

得物H5容器

2010-08-20 14:15:08

DB2性能调优

2016-03-22 15:05:00

定性移动数据开源
点赞
收藏

51CTO技术栈公众号