Break 关键字是退出 for 循环的最有效方法吗?C/C++

Lia*_*her 3 c c++ loops

break 是退出循环的最有效方法吗?在下面的代码片段中,A 行或 B 行是退出循环的更有效方式吗?任何有关中断指令如何在引擎盖下工作的材料的链接都将不胜感激。

for (int i = 0; i < 10; i++) {
       cout << i << endl;
       if (i == 3) {
           break;  // A
           i = 15; // B
       }
   }
Run Code Online (Sandbox Code Playgroud)

我认为在大多数情况下差异是微不足道的,并且 A 更快,因为 B 需要赋值、增量和比较,但我实际上不知道 break 是如何工作的,而且知道比假设更好。谢谢!

Apl*_*123 6

让我们编译以下代码并查看程序集:

#include <stdio.h>

int loop_with_break() {
    for (int i = 0; i < 10; i ++) {
        puts("Hello, world!");
        if (i == 3) {
            break;
        }
    }
}

int loop_with_assignment() {
    for (int i = 0; i < 10; i ++) {
        puts("Hello, world!");
        if (i == 3) {
            i = 10;
        }
    }
}

int main() {
    loop_with_break();
    loop_with_assignment();
}
Run Code Online (Sandbox Code Playgroud)

带断点的循环组装 带赋值的循环组装 如您所见,当您使用break, if 时i == 3,它将直接跳出循环到函数的末尾,而如果您使用i = 10,它将设置i为 10,将其增加 1,然后进行比较,即比较慢。但是,这是在没有优化的情况下编译的。如果您使用优化,它们最终都会变成一回事。但是,由于break它更具可读性并且不能保证这些优化,因此您应该使用它来跳出循环。

  • 谢谢!这真的很清楚。顺便问一下,你是怎么得到这些图表的?我是一名新编码员,对效率和优化感兴趣,但不知道从哪里开始。您可以向我指出的任何资源将不胜感激。 (2认同)
  • 这些图被称为调用图,我使用 Binary Ninja 生成它们,不幸的是,这是一个付费产品。然而,[godbolt.org](https://godbolt.org/) 是一个探索代码生成的程序集的好网站。 (2认同)