2014-12-09 137 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

现在很多体面的编译器会删除冗余流控制检查并生成第二个示例中指定的代码。