2014-12-09 247 views
2

是否有任何性能命中與使用類型特徵相關?類型特徵優化

更確切地說,下面的評估是否是恆定的時間?編譯器能夠優化以下幾種情況嗎?

考慮這樣的代碼:

template<typename T> void Function() 
{ 
    if(std::is_pointer<T>::value == true) 
     DoSmth(); 
} 

Function<int*>(); 

將編譯器優化這樣的代碼來有效地成爲(在生成的二進制)類似的東西?

template<> void Function<int*>() 
{ 
     DoSmth(); 
} 
+1

你的例子並不反映你開始的問題。 – rubenvb 2014-12-09 12:07:37

+1

@rubenvb它不以什麼方式?它看起來對我來說確實如此。 – hvd 2014-12-09 12:14:03

+0

@ hvd問題是否會出現類型特徵會導致性能損失。該示例詢問編譯器是否可以優化常量(即編譯時)條件表達式。這些不是一回事。 – rubenvb 2014-12-09 12:15:21

回答

4

編譯器肯定允許這樣的優化,我懷疑 大多數會傳播常量,並消除死代碼,如果 優化請求。

似乎更頻繁,更地道,但是,提供兩個 獨立的功能,沿着線:

template <typename T> 
typename std::enable_if<std::is_pointer<T>::value>::type 
Function() 
{ 
    // Pointer version... 
} 

template <typename T> 
typename std::enable_if<!std::is_pointer<T>::velue>>:type 
{ 
    // Non pointer version... 
} 

我們不得不enable_if甚至在此之前,它似乎更頻繁地使用於輔助超載 分辨率函數,通過傳遞一個額外的參數,其中 匹配void const*(如果它是一個指針)或...(如果它不是 )。

+1

您對函數重載的建議還有一個額外的好處:代碼在'if(std :: is_pointer :: value == true)'塊需要編譯,它需要在語法和語義上有效,即使類型不是指針。使用單獨的函數重載可以避免這個問題。 – hvd 2014-12-09 12:21:51

+0

@ hvd謝謝你。我知道,或者至少有人懷疑,單獨的功能成語如此廣泛地傳播是有原因的。我認爲你已經擊中了它。 (現在你提到它了:我懷疑大部分時間我都是這樣做的,其中一個函數的代碼不會爲其他類型編譯)。 – 2014-12-09 13:52:00

3

現在很多體面的編譯器會刪除冗餘流控制檢查並生成第二個示例中指定的代碼。