繁体   English   中英

不同的条件检查方式

[英]Different conditional checking ways

要检查是否在[1, ∞)范围内的int ,我可以使用以下方式(经常使用#1,#2):

  1. if (a>=1)
  2. if (a>0)
  3. if (a>1 || a==1)
  4. if (a==1 || a>1)

这四个版本之间我应该注意什么区别?

在功能上,您列出的4种方式之间没有区别。 这主要是样式问题。 我敢冒险说#1和#2是最常见的形式,如果我在代码审查中看到#3或#4,我建议进行更改。

明智的做法是,我认为有些编译器的优化可能优于另一种。 但是我真的对此表示怀疑。 充其量只是微优化,如果没有直接的分析器输入,我将永远不会以我的编码风格为基础

我真的不明白为什么要使用3或4。除了键入时间更长之外,它们还会生成更多代码。 由于在or条件下,如果第一个检查为true,则第二个检查将被跳过,因此,如果值不经常为1(版本4),则不应影响性能(版本4除外)(当然,具有分支预测功能的硬件将对此大为否定)。

1. if (a>=1)
2. if (a>0)
3. if (a>1 || a==1)
4. if (a==1 || a>1)

在x86上,选项1和2会生成cmp指令。 这将设置各种寄存器。 然后,在cmp是基于寄存器的条件分支/跳转。 对于第一个,它发出bge ,对于第二个,它发出bgt

从理论上讲,选项3和4需要两个cmp和两个分支,但是编译器可能会简单地对其进行优化以使其与1相同。

通常,您应该选择(a)遵循正在使用的代码中的约定(b)使用最清楚地表示要实现的算法的那个。

有时会明确地写“如果a等于1,或者它的值大于1”,那么在这些时候应该写if (a == 1 || a > 1) 但是,如果仅检查a具有非零的正整数值,则应写if (a > 0) ,因为这就是这样。

如果发现这种情况是性能瓶颈的一部分,则应检查汇编说明并进行相应调整-例如,如果发现有两个cmp和分支,则编写代码以使用一个比较和一个分支。

不! 对于int它们都是相同的。 但是,我更喜欢使用if (a>0)

暂无
暂无

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

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