C++:使用 goto 加速 for 循环?

标签 c++ goto

在下面的 for 循环中,如果 conditionAconditionBconditionC,我什么都不做> 所有评估为 true

for (int i = 0; i < imax; ++i) {
    bool conditionA;
    // evaluate conditionA

    bool conditionB;
    // evaluate conditionB

    bool conditionC;
    // evaluate conditionC

    if (conditionA && conditionB && conditionC) continue;

    // do something
}

如果 conditonA 的计算结果为 false,则无需计算 conditionBconditionC。所以看起来我可以通过下面的方式来写来加速循环。

for (int i = 0; i < imax; ++i) {
    bool conditionA;
    // evaluate conditionA

    if (conditionA) {
        bool conditionB;
        // evaluate conditionB

        if (conditionB) {
            bool conditionC;
            // evaluate conditionC

            if (conditionC) continue;
        }
    }   

    // do something
}

现在这个看起来很难看,第一眼看不懂。似乎使用臭名昭著的 goto 代码变得更加优雅:

for (int i = 0; i < imax; ++i) {
    bool conditionA;
    // evaluate conditionA
    if (!conditionA) goto doSomething;

    bool conditionB;
    // evaluate conditionB
    if (!conditionB) goto doSomething;

    bool conditionC;
    // evaluate conditionC
    if (conditionC) continue;

    doSomething:

    // do something
}

这是一种加速循环的方法,还是编译器足够聪明以至于代码的第一个版本实际上与第二个和第三个版本一样快?如果不是,是否有比使用 goto 更好的替代方法?

最佳答案

我会将条件的评估移动到单独的函数中,然后执行:

for (int i = 0; i < imax; ++i) {
    if (conditionA() && conditionB() && conditionC()) continue;

    // do something
}

如果 conditionA 返回 false,则永远不会调用 conditionB,依此类推。

这也会使您的功能更短、更简洁,将职责划分给其他功能。

如果你没有充分的理由像这样“提前退出”,你可以完全避免使用continue:

for (int i = 0; i < imax; ++i) {
    if (!(conditionA() && conditionB() && conditionC())) {
      // do something
    }
}

或者用德摩根定律得到 !conditionA() || !conditionB() || !conditionC - 无论你喜欢哪个。

关于C++:使用 goto 加速 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383448/

相关文章:

c++ - 如何在多个项目(以及一个版本的 cpplint.py)中使用单个 makefile?

c++ - g++ - 使用 "-g"标志进行生产是一个好主意吗?

c# - 使用 goto 的最佳实践

perl - 在 Perl 中,子类为基类中的方法设置别名的正确方法是什么?

compiler-construction - 为什么编译器不能(总是?)优化具有 GOTO 的代码?

c++ - boost bgl write_graphviz VertexPropertyWriter 和 EdgePropertyWriter

c++ - 创建一个类来表示商店的库存是否有意义?

c++ - cmake 将 header 包含到每个源文件中

java - Detection of Loops in Java Bytecode - 区分后端类型

java - GOTO/继续 Java 动态编程