【问题标题】:Is continue instant?是继续即时吗?
【发布时间】:2014-04-21 11:31:56
【问题描述】:

下面两个代码sn-ps,根据编译或运行的速度,实际上有什么不同吗?

for (int i = 0; i < 50; i++)
{
    if (i % 3 == 0)
        continue;

    printf("Yay");
}

for (int i = 0; i < 50; i++)
{
    if (i % 3 != 0)
        printf("Yay");
}

就个人而言,在不仅仅是打印语句的情况下,我一直使用第一种方法来减少包含代码的缩进量。一直在想,所以发现它的时候我问它是否真的有视觉以外的效果。

回复 Alf(我无法让代码在 cmets 中工作...)

对我的用法更准确的是类似于“handleObjectMovement”函数的内容,其中包括

for each object
    if object position is static
        continue

    deal with velocity and jazz

对比

for each object
    if object position is not static
        deal with velocity and jazz

因此我不使用返回。本质上是“如果它与本次迭代无关,请继续”

【问题讨论】:

  • 我认为首先在函数中处理琐碎的情况或错误情况,使用return 纾困,是可以的。但是continue的意思是代码的读者必须用额外的精力去分析。请记住,编写源代码并不是要向编译器传达它应该做什么,而是要向他人或后来的自己传达你​​的意图是什么。
  • 一个好的编译器应该将等效的源代码优化为相同的汇编代码。在任何特定情况下是否真的发生这种情况取决于太多事情需要事先确定。那你为什么不自己检查一下呢?检查生成的程序集和/或测量时间,您就会得到答案。
  • Branko 有两个原因,第一个很糟糕,但第二个我觉得很好:P 1) 我很懒 2) 用谷歌搜索这类问题很有用。现在任何想知道他们是否相同的人都有一个他们可以访问的 SO 页面。
  • Alf,我编辑了我的帖子以说明为什么 continue 是相关的,而 return 不是。谢谢大家的回复。

标签: c++ compiler-optimization continue


【解决方案1】:

行为是相同的,所以运行时速度应该是相同的,除非编译器做了一些愚蠢的事情(或者除非你禁用优化)。

不可能说编译速度是否存在差异,因为这取决于编译器如何解析、分析和翻译这两种变体的细节。

如果速度很重要,请衡量它。

【讨论】:

    【解决方案2】:

    如果您知道条件的哪个分支概率更高,您可以使用 GCC likely/unlikely macro

    【讨论】:

      【解决方案3】:

      完全摆脱支票怎么样?

      for (int t = 0; t < 33; t++)
      {
          int i = t + (t >> 1) + 1;
      
          printf("%d\n", i);
      }
      

      【讨论】:

      • 我认为他实际上是在询问编译器行为而不是这个特定代码
      • 尽管如此,您还是会惊讶于编写更智能的代码可以删除多少 continue 使用。您是否想到了一个不同的、更复杂的示例?
      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2022-11-02
      • 2013-04-12
      相关资源
      最近更新 更多