繁体   English   中英

将std :: isfinite()的编译时优化应用于整型

[英]Compile-time optimization for `std::isfinite()` applied to the integral types

我有一个设计选择。 我有一个模板化类myClass<T> ,它具有类型T的成员data_ 当前,目的是支持int ,几种复杂类型和double 因此,生成了三类模板:浮点类型,整数类型和复杂类型。

函数checkValidity()检查myClass类对象的有效性,该类现在仅限于使用std::isfinite()检查data_的有限性。

当前,该功能的实现如下:

template<class T>
bool myClass<T>::checkValidity() const noexcept
{
    if constexpr(std::is_floating_point_v<T> || std::is_integral_v<T>)
    {
        return std::isfinite(this->data_);
    }
    else if constexpr(is_complex<T>{})
    {
        return (std::isfinite(this->data_.real()) && std::isfinite(this->data_.imag()))
    }
    else static_assert(assert_false<T>::value , "wrong type");
}

其中is_complex<T>{}assert_false<T>是简单的自定义书面特征,它们确定类型是否为受支持的复杂特征之一,并使用错误地用于实例化的不受支持的T类型来保护其免受编译影响,分别。

现在,我想知道,由于整数类型总是有限的 ,因此将条件从第一个constexpr if分支移开是否有意义,如下所示:

if constexpr(std::is_integral_v<T>)
{
    return true;
}

根据我的理解,因为std::isfinite(value) ,其中value为整数类型将始终返回true

几乎可以归结为这个问题:

  • 当已知整数类型是整数时(例如在我的示例中),显式检查整数类型的有限性是否有意义?
  • 我是否希望编译器针对T = int的情况优化我的未修改版本?

前提:

随着时间的流逝,您将对编译器将优化为常量的内容产生直觉。 如果不确定,也为了建立直觉,应使用诸如Compiler Explorer之类的工具来查看编译器实际生成的内容。

是您在Compiler Explorer中提议的实现的非常粗糙的模型。 如果您std::isfinite直觉期望std::isfinite将对任何整数数据类型求值为常量表达式,那么结果就不足为奇了。 同样,根据这种直觉, double大小写std::isfinite为内联的std::isfinite调用,您可以在编译器资源管理器中查看生成的调用,以查找std::isfinite double调用std::isfinite的简单方法。

对于实际的复杂类,您可以使用该工具更深入地模拟您的Complex类,并查看编译器对该类做了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM