continue 语句真的提高了 C++ 中循环的速度吗?

Posted

技术标签:

【中文标题】continue 语句真的提高了 C++ 中循环的速度吗?【英文标题】:Does continue statement really increases the speed of the loop in C++? 【发布时间】:2019-08-03 14:08:38 【问题描述】:

所以,我是在线竞争编程的新手,我遇到了一个代码,我在 for 循环中使用了 if else 语句。我想提高循环的速度,在做了一些研究之后,我遇到了 break 和 continue 语句。

所以我的问题是,使用 continue 是否真的提高了循环的速度。

代码:

int even_sum = 0;
for(int i=0;i<200;i++)
      if(i%4 == 0)
         even_sum +=i;
         continue;
      else
           //do other stuff when sum of multiple of 4 is not calculated
                      
  

【问题讨论】:

godbolt.org,应该生成相同的代码 【参考方案1】:

在问题的具体代码中,有continue和没有continue的代码含义相同:无论哪种情况,执行离开even_sum +=i;后,都会流向for语句的结束 .任何质量中等的编译器都应该对这两个选项一视同仁。

continue 的预期目的不是通过请求编译器无论如何都会进行的跳转来加速代码,而是跳过当前循环迭代中不需要的代码——它的作用就像剩余的代码已被封闭在 else 子句中,但可能更具视觉吸引力,并且对人类对代码的感知的破坏性较小。

可以想象,一个非常初级的编译器,甚至是一个不错的编译器,但禁用了优化,可能会为continue 生成一个跳转指令,并且还会为if 语句的“then”子句生成一个跳转指令以跳转在else 子句上。后者永远不会被执行,并且不会对程序执行时间产生直接影响,但它会增加程序的大小,因此可能会产生间接影响。在典型的现代环境中,这种可能性可以忽略不计,您不太可能遇到这种初级编译器。

【讨论】:

【参考方案2】:

不,在这里使用continue 没有速度优势。您的两个代码都是相同的,甚至是without optimizations they produce the same machine code。

但是,有时continue 可以使您的代码更高效,如果您以特定方式构建循环,例如

这个:

int even_sum = 0;
for (int i = 0; i < 200; i++) 
    if (i % 4 == 0) 
        even_sum += i;
        continue;
    
    if (huge_computation_but_always_false_when_multiple_of_4(i)) 
        // do stuff
    

比:

更有效率
int even_sum = 0;
for (int i = 0; i < 200; i++) 
    if (i % 4 == 0) 
        even_sum += i;
    
    if (huge_computation_but_always_false_when_multiple_of_4(i)) 
        // do stuff
    

因为前者不必每次都执行huge_computation_but_always_false_when_multiple_of_4()函数。

因此,即使这两个代码总是产生相同的结果(假设 huge_computation_but_always_false_when_multiple_of_4() 没有副作用),第一个使用 continue 的代码会快很多。

【讨论】:

将第二个 if 更改为 else if 也是如此。 @PeteBecker 是的,显然,这只是一个粗略的例子。

以上是关于continue 语句真的提高了 C++ 中循环的速度吗?的主要内容,如果未能解决你的问题,请参考以下文章

今天是第七天啊,这次真的要准备混起来了

c++中的break,continue,goto语句

循环结构中breakcontinuereturn和exit的区别

C++从0到123C++中循环的跳转

循环语句,beark语句和continue语句,请举几个例子

continue语句的作用