Является ли ключевое слово Break наиболее эффективным способом выхода за l oop? C / C ++ - PullRequest
3 голосов
/ 02 августа 2020

Является ли break наиболее эффективным способом выхода из oop? В приведенном ниже фрагменте кода будет ли строка A или строка B более эффективным способом выхода из l oop? Любые ссылки на материалы о том, как работает инструкция break под капотом, будут оценены. а затем сравнение, но я на самом деле не знаю, как работает перерыв, и лучше знать, чем предполагать. Спасибо!

Ответы [ 4 ]

6 голосов
/ 02 августа 2020

Скомпилируем следующий код и посмотрим на сборку:

#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();
}

assembly of loop with break сборка л oop с назначением Как видите, когда вы используете break, если i == 3, он выскакивает прямо из l oop в конец функции, тогда как если вы используете i = 10, он установите i на 10, увеличьте его на 1, затем выполните сравнение, которое будет медленнее. Однако это было скомпилировано без оптимизации. Если вы используете оптимизацию, они оба становятся одним и тем же. Однако, поскольку break более читабелен и такая оптимизация не гарантируется, вы должны использовать его для выхода из циклов.

4 голосов
/ 02 августа 2020

Ключевое слово break просто выйдет из l oop без какого-либо сравнения, сделанного в условии l oop. Если вы используете синтаксис i = 15, l oop будет повторяться в следующий раз, чтобы проверить, больше ли значение переменной i 10, если да, то выйдите.

Короче говоря, break будет сломать l oop, ни о чем не думая, тогда как i = 15 приведет к еще одной итерации, чтобы посмотреть, удовлетворяет ли условие ему.

1 голос
/ 02 августа 2020

Вы правы! На самом деле ключевое слово break очень быстрее для взлома l oop!

В вашем примере, если вы используете строку A, то, как только элемент управления достигнет этого оператора, он немедленно сломает l oop.

С другой стороны, если вы используете строку B, тогда сначала будет выполнено присвоение, и снова элемент управления go перейдет к проверке условия, и когда условие станет ложным, оно выйдет из l oop!

0 голосов
/ 02 августа 2020

если вы выберете while l oop, вы можете предпочесть сделать условие ложным в while l oop. Но в этом случае имеет смысл использовать break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...