c++ - C++:是否值得使用 static_cast 来避免比较数字的条件?
问题描述
我尝试用 C++ 编写非常省时的代码。有人告诉我,如果条件允许,我应该尽可能避免。所以我认为类型转换可以完成这项工作。带有 if 条件的代码如下所示:
double a = .512; // some real number
double x = 1.1; // a coordinate that gets changed when if condition is true
a *= a; // a squared
if(a >= 1){x += .1;}
我会通过以下方式避免 if 条件。
double a = .512; // some real number
double x = 1.1; // a coordinate that gets changed when if condition is true
a *= a; // a squared
x += static_cast<bool>(static_cast<int>(a)) * .1
这首先转换a
为int
. 这给出0
了a<1
和一个非零int
的a>1
。然后第二次转换将所有非零int
s 转换为true
。但它真的更快吗?使用这种方法会遇到什么问题吗?
解决方案
不要费心以这种方式优化您的代码。如果您使用的是可靠的最新编译器,则只有两种方法可以使用。
您将搞砸并编写不严格等效的代码,因为您错过了边缘情况或您不小心导致了未定义的行为。
如果代码是等价的,无论如何它都会被编译成相同的指令。
在您的情况下,转换不等效。根据标准(cppreference page):
浮点类型的纯右值可以转换为任何整数类型的纯右值。小数部分被截断,即小数部分被丢弃。如果该值不能适合目标类型,则行为未定义(即使目标类型是无符号的,模运算也不适用)。如果目标类型为 bool,则这是一个布尔转换(见下文)。
太大的值、NaN 和无穷大都是您版本中的问题。
关于性能,它们应该是相似的。在 Godbolt ( link ) 上使用 GCC 7.3,程序集并不相同,但它们都包含一个条件跳转,这是您希望通过删除if
条件来避免的。
推荐阅读
- linux - 在 x86 汇编中使用指针返回结果
- r - 是否有一个 R 函数可以显示数据集中特定列中每个唯一出现的频率?
- reactjs - ReactJS 自定义 Hook 总是引发错误
- c# - 缺少 SHA256.HashData 方法?
- amazon-web-services - AWS codebuild 不支持 openjdk14?
- c# - C# AutoMapper Map来自两个不同的属性
- webpack - 如何修复 Chunk.modulesIterable 的弃用警告?
- java - java:如何确认数组已在数组操作菜单中创建
- arrays - Presto - 在列表中使用 serde?
- json - 从 JSON 解析创建简单结构