2011-02-06 54 views
4

Scott Meyers在「Effective C++」中指出,作爲在模板類/函數中實現一些算法的原因,編譯器中的矩陣操作。但是這些函數不能在運行時確定的參數上運行,顯然它們只適用於編寫到程序中的數字,或者最好作爲編譯器的參數給出。程序編譯完成後,每次運行時都會使用相同的輸出值。在那種情況下,爲什麼不用一個普通的(非模板化的)程序來計算這個值,並在必要時將它寫入原始程序呢?這不是更快來計算例如1000磅。 fft在編譯器中比在普通程序中肯定。什麼時候使用TMP預先計算出一個實際有用的值?

我能想到的最好方法是如果您需要爲不同的客戶編譯不同版本的程序,那麼TMP可能會爲您節省一些時間。但是這需要每一個實際上出現嗎?

回答

6

TMP在矩陣運算方面的主要優勢不在於能夠預先計算矩陣運算的結果,而是能夠優化用於在運行時進行實際矩陣計算的生成代碼。你是對的 - 你想要在程序中預先計算一個矩陣是不太可能的 - 但是在程序開始運行之前,要在編譯時優化矩陣運算是鮭魚。例如,考慮這樣的代碼:

Matrix a, b, c; 
/* ... Initialize these matrices ... */ 
Matrix d = a + b + c; 

這最後一行使用一些重載操作符來計算矩陣表達式。使用傳統的C++編程技術,這將如下工作:

  1. 計算b * c,返回一個包含副本的臨時矩陣對象。
  2. 計算a + b + c,再次返回一個臨時副本。
  3. 將結果複製到d中。

這很慢 - 沒有很好的理由在這裏做任何值的任何副本。相反,我們應該循環遍歷矩陣中的所有索引,並總結我們找到的所有值。然而,使用名爲expression templates的TMP技術,可以通過智能優化的方式實現這些計算,而不是緩慢的標準方式來實現這些運算符。這是我認爲梅耶斯在書中提到的這一系列技術。

TMP的最着名的例子是在編譯時預先計算值的簡單程序,但實際上它是像這些實際上在實踐中使用的更復雜的技術。

+0

不要移動語義類型的刪除這些東西的需要?或者我在這裏有錯誤的印象? – 2011-02-06 21:27:48

相關問題