自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析學(xué)習(xí)C++時(shí)的疑難問題

開發(fā) 后端
C++作為一種語言,大多數(shù)的人都是把它默認(rèn)為面向?qū)ο蟮闹С?,認(rèn)為他就是C語言的替代品,一種延伸而已,而事際上,C++與C是完全不同的語言。

許多編程人員學(xué)習(xí)C++總結(jié)經(jīng)驗(yàn)為,有的覺得C++語言是一門獨(dú)立的語言,并不是在C語言的基礎(chǔ)上,可以直接學(xué)習(xí)C++不必先從C下手,這就像C++與Java一樣,局部的結(jié)構(gòu)還是不一樣的。

C++作為一種通用的程序設(shè)計(jì)語言已相當(dāng)成功的實(shí)現(xiàn)了她最初的設(shè)計(jì)目標(biāo):高效率,通用性,可擴(kuò)展性與靈活性;是一種語言而不是一個(gè)系統(tǒng);她給予程序員尊重而不是束縛等等。

其實(shí),學(xué)習(xí)C++時(shí),它還支持一種被稱為模板元編程的泛型程序設(shè)計(jì)范型,其核心就是巧妙利用C++的模板機(jī)制與面向?qū)ο蟮臋C(jī)制將程序?qū)?shù)據(jù)的處理提前到編譯期,而不是運(yùn)行時(shí)。這種程序設(shè)計(jì)方式如同函數(shù)式的編程方式。在這種設(shè)計(jì)范型中沒有變量與循環(huán),但其圖靈完備所以稱其為元編程。

接下來我將舉一個(gè)簡(jiǎn)單的例子看看這種程序設(shè)計(jì)對(duì)運(yùn)行時(shí)效率的影響。有這么一組數(shù)列1,1,2,3,5,8,13,21,等等,最前一,二項(xiàng)是1,以后每一項(xiàng)是其前兩項(xiàng)的和?,F(xiàn)在我們編程計(jì)算第N項(xiàng)的數(shù)值。程序如下:

  1. //CODE  
  2. #include "stdafx.h"  
  3. //編譯期計(jì)算方法  
  4. template <int n>  //主模板 計(jì)算數(shù)列第N項(xiàng)  
  5. struct f  
  6. {  
  7.  enum {value=f<n-1>::value+f<n-2>::value};  
  8. };  
  9. template<> 
  10. struct f<1>  //特化模板  數(shù)列***項(xiàng)是1  
  11. {  
  12.  enum {value=1};  
  13. };  
  14. template<> 
  15. struct f<2>  //特化模板  數(shù)列第二項(xiàng)是1  
  16. {  
  17.  enum {value=1};  
  18. };  
  19. //遠(yuǎn)行時(shí)計(jì)算方法  
  20. long F (long n)  
  21. {  
  22.  if (n==1 || n==2)  //數(shù)列***,二項(xiàng)是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; //計(jì)算第45項(xiàng)的數(shù)值  
  34.  std::cout<<F(45)<<std::endl;  
  35.  return 0;  

特化模板就如同我們循環(huán)的終止條件,在模板的遞歸實(shí)例化過程中充當(dāng)遞歸終止條件。當(dāng)主模板的N降為1或2時(shí),模板遞歸實(shí)例化停止,開始計(jì)算value的數(shù)值。有人會(huì)問:為什么當(dāng)N等于1或2時(shí),編譯器會(huì)根據(jù)特化模板實(shí)例化呢?

還記得C++對(duì)函數(shù)的調(diào)用規(guī)則嗎?學(xué)習(xí)C++在調(diào)用重載函數(shù)過程中,編譯器會(huì)尋求最匹配的一個(gè)。其實(shí),在C++中,當(dāng)編譯器發(fā)現(xiàn)有眾多被選項(xiàng)時(shí),它會(huì)選擇***條件,最匹配的那個(gè)。這不是很合理嗎?

我想接下來的代碼就是你我非常熟悉不過的了,一個(gè)遞歸函數(shù),測(cè)試代碼,程序結(jié)果:

  1. template<> 
  2.  struct f<1>  //特化模板  數(shù)列***項(xiàng)是1  
  3.  {  
  4.   enum {value=1};  
  5.  };  
  6.  template<> 
  7.  struct f<2>  //特化模板  數(shù)列第二項(xiàng)是1  
  8. {  
  9.   enum {value=1};  
  10.  }; 

有人會(huì)問:?jiǎn)柼?hào)是什么意思?其實(shí)是“不知道”的意思。***行不到1秒(其實(shí)更短)就輸出了,而和它一模一樣運(yùn)行時(shí)的結(jié)果卻讓我等得花兒都謝了。為什么會(huì)這樣呢?編譯期學(xué)習(xí)C++運(yùn)行時(shí)計(jì)算秘密在于?:***行的結(jié)果在程序運(yùn)行時(shí)結(jié)果已經(jīng)早就被算出來了,程序只要簡(jiǎn)單的輸出即可;

而它的同胞兄弟還在運(yùn)行時(shí)堆棧里漫游了。模板實(shí)例化發(fā)生在程序構(gòu)造階段——編譯期,所以有關(guān)的計(jì)算都發(fā)生在編譯期,即編譯期計(jì)算。而普通的遞歸函數(shù)運(yùn)行于程序的運(yùn)行期,其執(zhí)行要牽涉大量的堆棧操作,有關(guān)計(jì)算必須在運(yùn)行時(shí)計(jì)算。由以上的直觀體驗(yàn)我們可以看到編譯期計(jì)算對(duì)程序運(yùn)行時(shí)的效率提高的影響是巨大的。

  1. C與C++中標(biāo)準(zhǔn)輸入實(shí)現(xiàn)方式上的一點(diǎn)區(qū)別
  2. C++編譯器如何對(duì)Const常量進(jìn)行分配存儲(chǔ)空間
  3. C++類庫設(shè)計(jì)的基本構(gòu)思與方法
  4. 玩轉(zhuǎn)C++語言的幾種方法
  5. 如何更好的進(jìn)行C++代碼編制
責(zé)任編輯:chenqingxiang 來源: NET130
相關(guān)推薦

2011-04-01 14:05:09

SQL數(shù)據(jù)庫

2017-04-18 22:50:10

OSPF疑難問題

2011-05-06 14:05:22

打印機(jī)照片打印

2012-05-04 09:18:46

2009-11-02 15:03:21

VSFTP服務(wù)

2009-12-23 08:53:56

Windows 7遠(yuǎn)程協(xié)助

2009-12-25 10:59:08

WPF Timer

2011-08-03 13:25:19

布線系統(tǒng)規(guī)劃

2011-04-26 16:39:30

照片打印機(jī)

2010-08-20 11:22:48

DB2性能調(diào)優(yōu)

2010-03-09 12:23:30

Python編碼

2010-01-26 16:54:58

學(xué)習(xí)C++

2009-12-24 18:03:35

WPF線程渲染

2010-08-13 14:40:14

DB2性能調(diào)優(yōu)

2009-06-18 08:46:56

微軟Windows 7操作系統(tǒng)

2010-01-11 16:19:05

C++ Builder

2010-07-05 14:41:21

SQL Server數(shù)

2023-05-29 18:33:30

得物H5容器

2010-08-20 14:15:08

DB2性能調(diào)優(yōu)

2016-03-22 15:05:00

定性移動(dòng)數(shù)據(jù)開源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)