在C函数结束时,循环中的break和return之间是否存在显着的性能差异?

时间:2015-10-04 05:29:25

标签: c++ c assembly

以下面的(Obj-)C(++)代码段为例:

// don't blame me for the 2-space indents. It's insane to type 12 spaces.
int whatever(int *foo) {
  for (int k = 0; k < bar; k++) { // I know it's a boring loop
    do_something(k);
      if (that(k))
        break; // or return
    do_more(k);
  }
}

一位朋友告诉我,使用break不仅更合乎逻辑(并且当有人想要事后向函数添加内容时使用return会导致麻烦),但也会产生更快的代码。它表示处理器在这种情况下为jmp - 指令提供了比ret更好的预测。

或者当然我在第一点上同意他,但如果确实存在一些重大差异,为什么编译器不优化呢?

2 个答案:

答案 0 :(得分:1)

如果键入2个空格是疯了,请使用带有自动缩进功能的体面文本编辑器。 4空格缩进 比2个空格更可读。

当您编写C代码时,可读性应该是一个基数值。

应根据上下文选择使用breakreturn,以使您的代码更易于理解和遵循。如果不是对别人,你会对自己有所帮助,几年之后你将会阅读自己的代码,寻找一个虚假的bug并试图理解它。

无论您选择哪个选项,编译器都会以自己的方式优化您的代码,不同的编译器,版本或配置将采用不同的方式。这种选择不会产生明显的差异,即使它不太可能出现,也不会持久。

专注于算法,数据结构,内存分配策略的选择,可能还有内存布局缓存的影响......这些对于速度和整体效率而言比本地微优化更为重要。

答案 1 :(得分:0)

任何编译器都能够优化跳转跳转。但实际上,在退出之前可能会有一些清理工作要做。如有疑问,请查看。我不知道这会如何产生任何重大影响。

在风格上,特别是在C语言中,当编译器超出范围时,编译器不会为我清理东西,我更喜欢单点返回,尽管我没有到{{1}一个。