【问题标题】:Type traits optimizations [duplicate]类型特征优化
【发布时间】:2014-12-09 11:52:49
【问题描述】:

使用类型特征是否有任何性能影响?

更准确地说,以下评估是恒定时间吗?并且编译器可以优化出以下一些情况吗?

考虑这样的代码:

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

Function<int*>();

编译器是否会优化此类代码以有效地(在生成的二进制文件中)成为类似的东西?

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

【问题讨论】:

  • 你的例子没有反映你开始的问题。
  • @rubenvb 以什么方式不呢?对我来说似乎是这样。
  • @hvd 问题询问类型特征是否会导致性能损失。该示例询问编译器是否可以优化常量(即编译时)条件表达式。这些不是一回事。
  • @hvd 我的意思是这个问题与类型特征无关。
  • @rubenvb 我只是没看到。不过,这不值得讨论。如果 OP 同意该问题不清楚,则 OP 可能会进行编辑。如果 OP 没有看到问题不清楚,则 OP 可能无法以符合您期望的方式进行编辑。无论哪种方式,它并不取决于你或我的想法。 :)

标签: c++ templates c++11


【解决方案1】:

编译器当然允许这样的优化,我怀疑 大多数人将传播常数并消除死代码,如果 请求优化。

然而,提供两个 单独的功能,大致如下:

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*(如果它是一个指针)或...(如果它 不是)。

【讨论】:

  • 您对函数重载的建议还有一个额外的好处:if (std::is_pointer&lt;T&gt;::value == true) 块内的代码需要编译,即使类型不是指针,它也需要在语法和语义上有效。使用单独的函数重载可以避免这个问题。
  • @hvd 谢谢。我知道,或者至少怀疑,分离函数成语如此广泛传播是有原因的。我想你已经成功了。 (既然你提到了它:我怀疑大部分时间我都做过这样的事情,我的其中一个函数的代码不会为其他类型编译。)
【解决方案2】:

如今,相当不错的编译器将删除多余的流控制检查并生成您在第二个示例中指定的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2016-04-14
    相关资源
    最近更新 更多