[英]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
的情况优化我的未修改版本? 前提:
data_
是一个大数组; checkValidity()
函数中发生了更多事情; std::isfinite()
应该通过强制转换为double
来检查有限性这一事实使我确信,从实际执行检查中不会得到任何信息。 随着时间的流逝,您将对编译器将优化为常量的内容产生直觉。 如果不确定,也为了建立直觉,应使用诸如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.