讀書筆記_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,在運行期直接執行乘法便可。性能

元編程有何優勢?spa

1. 以編譯耗時爲代價換來卓越的運行期性能,由於對於產品級的程序而言,運行的時長遠大於編譯時長。翻譯

2. 將原來運行期才能發現的錯誤提早到了編譯期,要知道,錯誤發現的越早,代價越小。debug

元編程有何缺點?調試

1. 代碼可讀性差,寫起來要運用遞歸的思惟,很是困難。code

2. 調試困難,元程序執行於編譯期,不能debug,只能觀察編譯器輸出的error來定位錯誤。blog

3. 編譯時間長,運行期的代價轉嫁到編譯期。遞歸

4. 可移植性較差,老的編譯器幾乎不支持模板或者支持極爲有限。編譯器

 

模板元編程TMP雖然有這麼多的缺點,但它已經被證實是「圖靈徹底」的了,意思是它的威力大到足以計算任何事物。目前boost庫中用到了一些TMP技術,但大部分項目仍是由於TMP的一些缺點而沒有普遍採用,因此這裏咱們只要略作了解便可。

 

下面總結一下:

1. TMP可將工做由運行期轉移到編譯期,於是得以實現早期錯誤偵測或者更高的執行效率。

2. TMP可被用來生成「基於政策選擇組合」的客戶定製代碼,也能夠用來避免生成對某些特殊類型並不適合的代碼。(這句話看不懂也不要緊)

相關文章
相關標籤/搜索