【问题标题】:unsigned int a; while(a-- != 0) and while(a-- > 0) , which "while" will be faster? [closed]无符号整数a; while(a-- != 0) 和 while(a-- > 0) ,哪个“while”会更快? [关闭]
【发布时间】:2016-01-31 08:42:42
【问题描述】:

我想知道,对于 unsigned int a;while(a-- != 0)while(a-- > 0) 是否需要相同的时间和数量的指令来执行。

哪个更好用?

【问题讨论】:

  • 编译和反汇编并调查输出。 C标准没有说明指令的数量,所以取决于编译器等。
  • 你也可以使用while(a--)
  • 最好使用arrow operator: while (a --> 0)...
  • @AnT,问题指定了 uint。
  • ...但是,是的。理论上可能取决于编译器和指令集,但在实践中,两者都不会更快(并且专注于这种微优化的人忽略了他们应该关注的代码结构区域改为)。

标签: c linux arm


【解决方案1】:

“更快”或“更慢”的概念不适用于 C 代码。 C 语言结构没有与之相关的任何特定“速度”。只能分析生成的机器代码的速度。

如果a 是无符号类型,任何自尊的编译器都应该为两个版本生成相同的代码。 “大于零”和“不等于零”是无符号值的等效比较。

即使某些编译器决定按字面翻译它,但对于许多现代平台来说,区别只是一个特定的条件跳转指令。反正性能是一样的。

【讨论】:

  • “过早优化” ...
【解决方案2】:

它们都花费相同的时间,并且unsigned int a 可能无论如何都会生成相同的代码。

关于第二个问题,我赞成第二个:

while(a-- > 0)

有两个原因:

  • 它更具可读性:它让读者很明显a 将从初始值下降到0 包括在内。
  • 它更加一致,因为它对于signedunsigned 值具有相同的行为。您可以将此习惯用法用于所有向下迭代,如果 asigned 并且初始值为负,则循环将被正确跳过。

【讨论】:

  • 同意a-- > 0 的偏好。任何时候使用!,都需要一点额外的理解,“除非你没有不同意”。
猜你喜欢
  • 1970-01-01
  • 2019-10-11
  • 2013-08-24
  • 2014-08-12
  • 2022-12-01
  • 2012-06-23
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多