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

use*_*682 1 c++ goto

在下面的for-loop,如果我没有做任何事情conditionA,conditionBconditionC所有的评估来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
}
Run Code Online (Sandbox Code Playgroud)

如果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
}
Run Code Online (Sandbox Code Playgroud)

现在这看起来很丑陋,乍看之下并不明白.似乎使用臭名昭着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
}
Run Code Online (Sandbox Code Playgroud)

这是否可以作为加速循环的方法,或者编译器是否足够智能,以至于第一个版本的代码实际上和第二个和第三个版本一样快?如果不是,是否有比使用更好的选择goto

Jos*_*eld 21

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

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

    // do something
}
Run Code Online (Sandbox Code Playgroud)

如果conditionA返回false,conditionB将永远不会被调用,依此类推.

这也将使您的功能更短,更简洁,将职责分配到其他功能中.

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

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

或者使用De Morgan定律!conditionA() || !conditionB() || !conditionC- 无论您喜欢哪种方式.