gpt4 book ai didi

c++ - `std::isfinite()` 的编译时优化应用于整数类型

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:29 24 4
gpt4 key购买 nike

我要做出设计选择。我有一个模板类 myClass<T>有一个成员 data_类型 T .目前打算支持int ,几个复杂类型,和 double ;从而形成浮点型、整数型、复数型三类模板。

函数checkValidity() , 检查类对象的有效性 myClass现在将仅限于简单地检查 data_ 的有限性通过使用 std::isfinite() .

目前该功能实现如下:

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 进行编译。分别被错误地用于实例化。

现在,我想知道,自 integral types are always finite , 将条件从第一个 constexpr if 移动是否有意义分支,如下:

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

?

据我了解std::isfinite(value) , 其中value是整数类型总是返回 true .

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

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

场所:

最佳答案

随着时间的推移,您将对编译器将优化为常量的内容产生直觉。如果您不确定,并且为了建立您的直觉,您应该使用 Compiler Explorer 等工具来查看编译器实际生成的内容。

Here是您在编译器资源管理器中提出的实现的非常粗略的模型。如果您凭直觉期望 std::isfinite 将计算为任何整数数据类型的常量表达式,那么结果就不足为奇了。同样遵循直觉,double 案例简化为内联的 std::isfinite 调用,您可以在编译器资源管理器中通过查看生成的简单方法调用来验证它只需调用 std::isfinite 即可。

对于实际的复杂类,您可以使用该工具更深入地模拟您的 Complex 类,并查看编译器如何处理它。

关于c++ - `std::isfinite()` 的编译时优化应用于整数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57530985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com